Ответ
Нет, стандартная map в Go не потокобезопасна. При одновременном чтении и записи в map из разных горутин может возникнуть состояние гонки (race condition), приводящее к неопределённому поведению или панике.
Для потокобезопасной работы с map можно использовать:
- sync.Mutex или sync.RWMutex для блокировок
- sync.Map (для высоконагруженных read-heavy сценариев)
Пример с sync.RWMutex:
type SafeMap struct {
sync.RWMutex
m map[string]int
}
func (s *SafeMap) Get(key string) int {
s.RLock()
defer s.RUnlock()
return s.m[key]
}
func (s *SafeMap) Set(key string, val int) {
s.Lock()
defer s.Unlock()
s.m[key] = val
}