L'erreur "Erreur fatale : lecture et écriture de carte simultanées" dans Go se produit lorsque plusieurs goroutines essayez d'accéder à une carte simultanément pour la lecture et l'écriture. Cela peut se produire lorsqu'une goroutine essaie de lire la carte pendant qu'une autre goroutine y écrit simultanément.
sync.RWMutex
Utiliser un sync.RWMutex pour contrôler l'accès à la carte. Cette option convient aux scénarios avec des lectures et des écritures uniques (pas de boucles sur la carte).
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
Une alternative consiste à utiliser une syncmap .Map{}, qui est un type de carte simultané dans Go. Elle gère les conditions de course en interne et est généralement plus lente qu'une carte classique. Cependant, il excelle dans les scénarios de boucle 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 })
Pour éviter cette erreur, il est recommandé de tester votre serveur avec l'option -race pour identifier et éliminer les conditions de concurrence potentielles. .
go run -race server.go
En implémentant ces solutions et en suivant ces directives, vous pouvez éviter l'erreur « lecture et écriture de carte simultanées » et garantir un accès sécurisé aux threads partagés. données dans votre code Go.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!