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中文网其他相关文章!