我想写一些这样的代码:
var myValue interface{}
func GetMyValue() interface{} {
return atomic.Load(myValue)
}
func StoreMyValue(newValue interface{}) {
atomic.Store(myValue, newValue)
}
似乎我可以在原子包中使用 LoadUintptr(addr * uintptr)(val uintptr)和 StoreUintptr(addr * uintptr,val uintptr)来实现此目的,但是我不知道如何在 uint之间进行转换,不安全。指针和接口(interface){} 。
如果我这样做:
var V interface{}
func F(v interface{}) {
p := unsafe.Pointer(&V)
atomic.StorePointer(&p, unsafe.Pointer(&v))
}
func main() {
V = 1
F(2)
fmt.Println(V)
}
V 将始终为1
最佳答案
如果我没记错的话,您需要atomic Value。您可以使用它原子地存储和获取值(签名为interface{}
,但应将相同的类型放入其中)。它在引擎盖下做了一些不安全的指针操作,就像您想做的一样。
来自文档的示例:
var config Value // holds current server configuration
// Create initial config value and store into config.
config.Store(loadConfig())
go func() {
// Reload config every 10 seconds
// and update config value with the new version.
for {
time.Sleep(10 * time.Second)
config.Store(loadConfig())
}
}()
// Create worker goroutines that handle incoming requests
// using the latest config value.
for i := 0; i < 10; i++ {
go func() {
for r := range requests() {
c := config.Load()
// Handle request r using config c.
_, _ = r, c
}
}()
}
关于go - 如何在Golang中原子存储和加载接口(interface)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47750967/