Назад к вопросам
Intern
9
Читать map потокобезопасно в Go?
Компании, где спрашивали
Adapty
Ответ от нейросети
sobes.tech AI
В Go чтение из map не является потокобезопасным, если одновременно происходит запись. Чтобы безопасно читать из map в многопоточной среде, нужно использовать синхронизацию, например, sync.RWMutex для блокировки на чтение и запись, или использовать sync.Map, который специально разработан для конкурентного доступа.
Пример с sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // блокировка на чтение
defer mu.RUnlock() // разблокировка
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // блокировка на запись
defer mu.Unlock() // разблокировка
m[key] = val
}
Или использовать sync.Map:
import "sync"
var m sync.Map
func read(key string) (interface{}, bool) {
return m.Load(key)
}
func write(key string, val interface{}) {
m.Store(key, val)
}
sync.Map удобен, когда много конкурентных операций, но имеет особенности по производительности и API.