> Являются ли мапы в Go потокобезопасными (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: ЦУМ, InDrive
Стек: Go
> Пример ответа
Нет, встроенные мапы (map) в Go не являются потокобезопасными. Одновременное чтение и запись в одну и ту же мапу из разных горутин (goroutine) приводит к data race (гонке данных) и может вызвать панику с сообщением fatal error: concurrent map writes или concurrent map read and map write.
Пример опасного кода:
GOm := make(map[int]int)go func() {for {m[1] = 1 // запись}}()go func() {for {_ = m[1] // чтение}}()// Будет паника или неопределённое поведение
Для безопасного конкурентного доступа используйте:
-
sync.Mutex или sync.RWMutex - оборачивайте операции с мапой в блокировки.
-
sync.Map - встроенная потокобезопасная мапа, оптимизированная для сценариев с частым чтением и редкой записью, а также для кэширования.
Пример с sync.Mutex:
GOtype SafeMap struct {mu sync.Mutexm map[int]int}func (s *SafeMap) Set(key, val int) {s.mu.Lock()defer s.mu.Unlock()s.m[key] = val}
Используйте sync.Map, когда ключи стабильны, а операции чтения значительно преобладают над записью. В остальных случаях предпочтительнее явная синхронизация через мьютексы.
> Похожие задачи по backend
Приходилось ли работать с базами данных?
Какие способы копирования слайса в Go существуют
Как сделать так, чтобы изменения слайса в функции были видны в вызывающей функции
Как защититься от SQL-инъекций
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью