> Как использовать мьютексы для защиты мапы при параллельном доступе в Go (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Т-Банк

Стек: Go

> Пример ответа

В Go мьютекс (sync.Mutex) используется для защиты мапы от состояния гонки при параллельном доступе. Основная идея - блокировать доступ к мапе перед чтением или записью и разблокировать после завершения операции.

Пример реализации:

GO
import "sync"
type SafeMap struct {
mu sync.Mutex
m map[string]int
}
func NewSafeMap() *SafeMap {
return &SafeMap{m: make(map[string]int)}
}
func (s *SafeMap) Set(key string, value int) {
s.mu.Lock()
defer s.mu.Unlock()
s.m[key] = value
}
func (s *SafeMap) Get(key string) (int, bool) {
s.mu.Lock()
defer s.mu.Unlock()
val, ok := s.m[key]
return val, ok
}

Ключевые моменты:

  • Используйте Lock() перед изменением мапы и Unlock() после, либо defer s.mu.Unlock() для гарантии освобождения.
  • Для операций только чтения можно использовать RLock()/RUnlock() с sync.RWMutex, чтобы разрешить параллельное чтение, но блокировать запись.
  • Никогда не копируйте мьютекс после его использования - передавайте указатель на структуру.
  • Если мапа используется в нескольких горутинах, всегда синхронизируйте доступ, иначе возникнет паника из-за конкурентной записи.

Для простых сценариев также подходит sync.Map, но она оптимизирована для специфических паттернов (редкие записи, частые чтения). В общем случае ручное управление с мьютексом даёт больше контроля и производительности.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью