Go:如何同步和共享数据

Go:如何同步和共享数据,go,Go,我正在编写一个net/http服务器。我的请求处理程序需要访问由另一个go例程更新的一些共享数据。这个go例程保持单个结构的更新,并且所有的net/http处理程序都需要访问同一个结构 type MyData struct { Expiration time.Time A string B string C string } func update(data MyData) { go func() { for { if data.Expiration

我正在编写一个net/http服务器。我的请求处理程序需要访问由另一个go例程更新的一些共享数据。这个go例程保持单个结构的更新,并且所有的net/http处理程序都需要访问同一个结构

type MyData struct {
  Expiration time.Time
  A  string
  B  string
  C string
}

func update(data MyData) {
  go func() {
    for {
      if data.Expiration >= time.Now() {
        // set A, B, C
      }
      // sleep
    }
  }()
}
让单一的、通用的MyData可用于其他go例程的最佳方法是什么?我在想一个频道,但该频道的每个读者都应该获得相同的MyData。问题是,从频道读取内容会使项目从频道中弹出。我想我是在寻找如何在读卡器端偷看()并在更新时在写卡器端吸取()

基于互斥的解决方案

type MyData struct {
    Expiration time.Time
    A  string
    B  string
    C string
}

type MutexedMyData struct {
    sync.RWMutex
    MyData MyData
}

var m = &MutexedMyData{}


func (m *MutexedMyData) Update(my_data MyData)  {
    m.Lock()
    m.MyData = my_data
    m.Unlock()
}

func (m *MutexedMyData) Read() MyData {
    u.RLock()
    value := m.MyData
    u.RUnlock()

    return value
}

当您想要在单个资源周围实现“互斥”时,通常需要一种非显而易见的方式——如果频繁更新,则需要一个互斥或RWLock(如果允许多个同时读卡器很重要)。如果它的读取频率远高于更新频率(比如每次请求都使用的配置+很少更新),则可以在原子.Value中包含一个指针,并在刷新时用新实例替换它。@twoo:谢谢。我就是这么想的。假设我为我的结构创建了一个MY_DATA全局变量。我可以安全地将RWLock放在结构中吗?或者互斥体需要是一个单独的全局变量吗?Marcel已经知道了--是的,互斥体等可以而且经常存在于结构中。谢谢!新手快速提问:func声明中
(m*MutexedMyData)
的意义是什么?您可以将它们用作m.Update或m.Read