我是go語言的新手。當(dāng)我執(zhí)行代碼時,出現(xiàn)以下錯誤:fatal error:并發(fā)映射讀取和映射寫入func foo() { var m = map[string]int{"a": 1} var lock = sync.RWMutex{} go Read(m, lock) time.Sleep(1 * time.Second) go Write(m, lock) time.Sleep(1 * time.Minute)}func main() { foo()}func Read(m map[string]int, lock sync.RWMutex) { for { read(m, lock) }}func Write(m map[string]int, lock sync.RWMutex) { for { write(m, lock) }}func read(m map[string]int, lock sync.RWMutex) { lock.RLock() defer lock.RUnlock() _ = m["a"]}func write(m map[string]int, lock sync.RWMutex) { lock.Lock() defer lock.Unlock() m["b"] = 2}誰能告訴我為什么?
1 回答

一只萌萌小番薯
TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個贊
您必須傳遞一個指向您的sync.RWMutex
值的指針。否則,每次將互斥體傳遞給新函數(shù)時,您都會復(fù)制該互斥體,因此不會發(fā)生實(shí)際的鎖定。
該go vet
工具將為您檢測到此錯誤。您應(yīng)該在所有代碼上運(yùn)行go vet
(以及可能的其他 linter ),以幫助捕獲此類常見錯誤。
- 1 回答
- 0 關(guān)注
- 162 瀏覽
添加回答
舉報
0/150
提交
取消