首頁 >後端開發 >Golang >如何解決Go中的「致命錯誤:並發map讀取和map寫入」?

如何解決Go中的「致命錯誤:並發map讀取和map寫入」?

Patricia Arquette
Patricia Arquette原創
2024-12-31 04:09:40443瀏覽

How to Solve the

“Golang 致命錯誤:並發映射讀取和映射寫入”解釋

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn