我正在写一个net / http服务器。我的请求处理程序需要访问由另一个go-routine更新的一些共享数据。此go-routine保持单个结构更新,并且所有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用于其他常规程序的最佳方法是什么?我在考虑一个频道,但频道的每个读者都应该获得相同的MyData。问题是从频道读取会弹出该频道的项目。我想我正在寻找如何在读者方面看Peek(),以及在作者更新的时候在作者方面看Drain()。
答案 0 :(得分:3)
基于互斥锁的解决方案
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
}