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

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

Patricia Arquette
發布: 2024-12-31 04:09:40
原創
428 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板