Go에서 "치명적인 오류: 동시 맵 읽기 및 맵 쓰기" 오류는 여러 고루틴이 발생하는 경우 발생합니다. 읽기와 쓰기 모두를 위해 동시에 지도에 액세스해 보십시오. 이는 한 고루틴이 맵에서 읽기를 시도하는 동안 다른 고루틴이 동시에 맵에 쓰는 경우에 발생할 수 있습니다.
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-loop 시나리오에서는 탁월합니다.
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에서 '치명적인 오류: 동시 맵 읽기 및 맵 쓰기'를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!