我想写一些这样的代码:

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/

10-11 21:23