A million ways to die from a data race in Go
Автор описывает реальные data races в Go, подчёркивая, что несмотря на простоту concurrency, язык полон ловушек. Согласно Go memory model, data races не безвредны: они могут привести к arbitrary memory corruption, особенно при гонках на multiword структурах вроде slices, maps, interfaces и strings — "races on multiword data structures can lead to inconsistent values not corresponding to a single write".
Первый пример: случайный захват внешней переменной err в замыканиях errgroup.Go, где горутины мутируют её concurrently. Fix: локальная err := или named return. Второй: concurrent использование http.Client, не thread-safe; fix — отдельные клиенты. Третий: mutex с неправильным lifetime (локальный в функции); fix — поле структуры. Четвёртый: concurrent чтение/запись в stdlib-контейнеры (sync.Map OK, но slices/maps — нет); fix — mutex или sync.* типы. Рекомендует race detector, именованные мьютексы и paper "A Study of Real-World Data Races in Golang". Идеи улучшения: warnings компилятора, runtime checks.