Map в Go не потокобезопасна — конкурентная запись вызывает fatal error: concurrent map writes. Три способа защиты:
1. sync.Mutex:
var mu sync.Mutex
var m = make(map[string]int)
mu.Lock()
m["key"] = 1
mu.Unlock()
2. sync.RWMutex — множество читателей, один писатель:
var mu sync.RWMutex
mu.RLock() // для чтения
mu.RUnlock()
mu.Lock() // для записи
mu.Unlock()
3. sync.Map — встроенная потокобезопасная map. Оптимальна при read-heavy нагрузке с непересекающимися ключами.
Для большинства случаев map + sync.RWMutex — лучший выбор по производительности и простоте.