Получить доступ

Что такое гонка данных в Go и как её найти?

JuniorГорутины и каналы
Ещё спрашивают так:
  • Что делает флаг -race?
Коротко

Гонка данных — две горутины обращаются к одной переменной одновременно, и хотя бы одна пишет, без синхронизации. Результат непредсказуем, а для мап и срезов возможна порча структуры. go test -race / go run -race включает детектор: он отслеживает обращения и печатает стеки обеих сторон гонки.

  • Детектор находит только гонки, которые произошли при запуске — нужны тесты с конкурентностью
  • Замедление в 2–20 раз и больше памяти — включают в CI, а не в проде
  • Исправление: мьютекс, канал, atomic или отказ от общего состояния

А ещё Переменная цикла в горутине — классическая гонка до Go 1.22

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

var counter int
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func() { defer wg.Done(); counter++ }()   // гонка
}
wg.Wait()

go run -race main.go выведет «WARNING: DATA RACE» со стеками записи и чтения.

Модель памяти Go: без синхронизации (каналы, мьютексы, атомики, WaitGroup) нет гарантии, что одна горутина увидит запись другой. Гонка — это не только потеря обновлений, но и чтение «разорванных» значений: интерфейсы и срезы состоят из нескольких слов.

Практика: -race во всех тестах в CI; конкурентные тесты, которые реально запускают код параллельно; при сообщении детектора — не глушить, а исправлять.

Что хотят услышать

  • Определение гонки данных.
  • Флаг -race и его ограничения.
  • Способы исправления.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем