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