Golang 在 sync.Map 中操作对象

我正在尝试操作 golang sync.Map 的 sync.Map,但我在转换时遇到了一些问题。我有以下代码:


func (cluster *Cluster) action(object1, object2 MyObject) {

                value, _ := cluster.globalMap.LoadOrStore(object1.name, sync.Map{})

                localMap := value.(sync.Map)

                localMap.Store(object2.Name, object2)

                

                value2, _ := cluster.resourceInflight.Load(node.Name)

                forComparison := value2.(sync.Map)

                fmt.Println(localMap.Load(object2.Name))

                fmt.Println(forComparison.Load(object2.Name))

}

{myObject  map[] map[]} true

<nil> false


我这样做是因为我希望保持 localMap 线程的内容安全。


问题是我希望我的两个打印结果相同,因为“forComparison”应该指向与“localMap”相同的对象。但第二个结果为零。


我怀疑问题出在将接口“值”转换为实际的“sync.Map”。但我不确定如何使用内联转换调用 .Store 方法。


我考虑过将 localMap 存储在 cluster.globalMap 中,但这对我来说似乎不正确,因为它会破坏使用 localSyncMap 的全部意义并产生并发问题。


关于我应该做什么的任何意见?


犯罪嫌疑人X
浏览 122回答 1
1回答

杨__羊羊

根据评论,问题是您正在复制sync.Map; 以下代码将失败(输出“未找到”-操场):var sm sync.Mapvar x interface{}x = smsm2 := x.(sync.Map)sm2.Store("test", "test")result, ok := sm.Load("test")if ok {&nbsp; &nbsp; fmt.Printf("Found: %s\n", result)} else {&nbsp; &nbsp; fmt.Printf("Not found\n")}而使用指针按预期工作:var sm sync.Mapvar x interface{}x = &smsm2 := x.(*sync.Map)sm2.Store("test", "test")result, ok := sm.Load("test")if ok {&nbsp; &nbsp; fmt.Printf("Found: %s\n", result)} else {&nbsp; &nbsp; fmt.Printf("Not found\n")}运行go vet可能会警告您其他问题(sync.Map包含 async.Mutex并且这些“首次使用后不得复制”)。请注意 Sync.Map 状态的文档:Map 类型是专门的。大多数代码应该使用普通的 Go 映射,使用单独的锁定或协调,以获得更好的类型安全性并更容易维护其他不变量以及映射内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go