Вопрос проверяет понимание механизмов синхронизации доступа к разделяемым данным в Go, что необходимо для написания безопасных конкурентных программ.
В Go встроенная map не является потокобезопасной. Если несколько горутин одновременно читают и пишут в одну map без синхронизации, возникает race condition, приводящий к панике или некорректным данным. Для решения этой проблемы используются примитивы синхронизации.
sync.RWMutex — это блокировка с разделением на чтение и запись. Она позволяет множеству горутин одновременно удерживать блокировку на чтение (RLock), но только одной — на запись (Lock). Это оптимально для сценариев, где чтений значительно больше, чем записей.
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]int
}
func (sm *SafeMap) Read(key string) (int, bool) {
sm.mu.RLock()
defer sm.mu.RUnlock()
val, ok := sm.data[key]
return val, ok
}
func (sm *SafeMap) Write(key string, value int) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.data[key] = value
}Используйте sync.RWMutex для защиты map, когда чтения преобладают над записями. Для простых случаев или когда нужна максимальная производительность в специфических паттернах доступа, рассмотрите sync.Map.