我正在嘗試操作 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 的全部意義并產生并發問題。
關于我應該做什么的任何意見?
uj5u.com熱心網友回復:
根據評論,問題是您正在復制sync.Map; 以下代碼將失敗(輸出“未找到”-操場):
var sm sync.Map
var x interface{}
x = sm
sm2 := x.(sync.Map)
sm2.Store("test", "test")
result, ok := sm.Load("test")
if ok {
fmt.Printf("Found: %s\n", result)
} else {
fmt.Printf("Not found\n")
}
而使用指標按預期作業:
var sm sync.Map
var x interface{}
x = &sm
sm2 := x.(*sync.Map)
sm2.Store("test", "test")
result, ok := sm.Load("test")
if ok {
fmt.Printf("Found: %s\n", result)
} else {
fmt.Printf("Not found\n")
}
運行go vet可能會警告您其他問題(sync.Map包含 async.Mutex并且這些“首次使用后不得復制”)。
請注意 Sync.Map 狀態的檔案:
Map 型別是專門的。大多數代碼應該使用普通的 Go 映射,使用單獨的鎖定或協調,以獲得更好的型別安全性并更容易維護其他不變數以及映射內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430395.html
標籤:走
上一篇:goroutine如何設計場景
