Go 中的錯誤“致命錯誤:並發映射讀取和映射寫入”是在多個Goroutine 時發生的嘗試同時存取地圖以進行讀取和寫入。當一個 goroutine 嘗試從映射中讀取數據,而另一個 goroutine 同時向其中寫入資料時,就會發生這種情況。
sync.RWMutex
使用一個sync.RWMutex來控制對地圖的存取。此選項適用於單次讀取和寫入的場景(不是在映射上循環)。
var someMap = map[string]string{} var someMapMutex = sync.RWMutex{} go func() { someMapMutex.Lock() someMap["key"] = "value" someMapMutex.Unlock() }() someMapMutex.RLock() v, ok := someMap["key"] someMapMutex.RUnlock() if !ok { fmt.Println("key missing") return } fmt.Println(v)
syncmap.Map
另一種方法是使用syncmap .Map{},Go 中的並發地圖類型。它在內部處理競爭條件,通常比常規地圖慢。但是,它在 for 循環場景中表現出色。
var someMap = syncmap.Map{} go func() { someMap.Store("key", "value") }() v, ok := someMap.Load("key") if !ok { fmt.Println("key missing") return } fmt.Println(v) // Looping over keys is simplified with syncmap someMap.Range(func(key, value interface{}) bool { val, ok := value.(string) if !ok { return false // Break iteration } fmt.Println(key, val) return true // Continue iteration })
為了防止此錯誤,建議使用-race 選項測試您的伺服器,以識別並消除潛在的競爭條件.
go run -race server.go
透過實作這些解決方案並遵循這些準則,您可以避免「並發映射讀取和映射寫入」錯誤並確保執行緒安全存取Go 程式碼中的共用資料。
以上是如何解決Go中的「致命錯誤:並發map讀取和map寫入」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!