Heim >Backend-Entwicklung >Golang >Wie behebt man den „schwerwiegenden Fehler: gleichzeitiges Kartenlesen und Kartenschreiben' in Go?

Wie behebt man den „schwerwiegenden Fehler: gleichzeitiges Kartenlesen und Kartenschreiben' in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-31 04:09:40449Durchsuche

How to Solve the

„Schwerwiegender Golang-Fehler: gleichzeitiges Kartenlesen und Kartenschreiben“ erklärt

Der Fehler „schwerwiegender Fehler: gleichzeitiges Kartenlesen und Kartenschreiben“ in Go tritt auf, wenn mehrere Goroutinen ausgeführt werden Versuchen Sie, gleichzeitig lesend und schreibend auf eine Karte zuzugreifen. Dies kann passieren, wenn eine Goroutine versucht, von der Karte zu lesen, während eine andere Goroutine gleichzeitig darauf schreibt.

Lösungen

sync.RWMutex

Verwendung ein sync.RWMutex zur Steuerung des Zugriffs auf die Karte. Diese Option eignet sich für Szenarien mit einzelnen Lese- und Schreibvorgängen (keine Schleifen über die Karte).

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

Eine Alternative ist die Verwendung einer Syncmap .Map{}, ein gleichzeitiger Kartentyp in Go. Sie verwaltet die Rennbedingungen intern und ist im Allgemeinen langsamer als eine normale Karte. Es eignet sich jedoch hervorragend für For-Loop-Szenarien.

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
})

Allgemeiner Hinweis

Um diesen Fehler zu verhindern, wird empfohlen, Ihren Server mit der Option -race zu testen, um potenzielle Race-Bedingungen zu identifizieren und zu beseitigen .

go run -race server.go

Durch die Implementierung dieser Lösungen und die Befolgung dieser Richtlinien können Sie den Fehler „gleichzeitiges Lesen und Schreiben von Karten“ vermeiden und einen threadsicheren Zugriff auf freigegebene Daten in gewährleisten Ihr Go-Code.

Das obige ist der detaillierte Inhalt vonWie behebt man den „schwerwiegenden Fehler: gleichzeitiges Kartenlesen und Kartenschreiben' in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn