> Почему при эвакуации данных в мапе Go возникает проблема с конкурентным доступом и race condition (Go)

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

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

Стек: Go

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

В Go мапа (map) - это встроенная структура данных, которая не является потокобезопасной по умолчанию. При эвакуции данных (rehashing/evacuation) во время роста мапы возникает race condition, потому что:

  1. Внутренняя структура мапы содержит хеш-таблицу с бакетами (buckets). При превышении коэффициента загрузки Go запускает процесс эвакуации: создаётся новая таблица большего размера, и данные из старых бакетов постепенно перемещаются в новые.

  2. Конкурентный доступ без синхронизации (например, через мьютекс) приводит к тому, что одна горутина может читать данные из старого бакета, в то время как другая горутина одновременно пишет в тот же бакет или перемещает его в новый. Это нарушает атомарность операций.

  3. Race Condition проявляется в виде:

    • Чтения частично перемещённых данных (коррупция данных)
    • Одновременной записи в один и тот же бакет разными горутинами
    • Попытки чтения из уже освобождённого бакета

Go детектирует такие ситуации через -race флаг и паникует с сообщением "concurrent map writes" или "concurrent map read and map write". Для безопасной работы с мапой в конкурентной среде используйте sync.RWMutex или sync.Map (для специфических сценариев с частыми чтениями и редкими записями).

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

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