Ответ
Race condition возникает, когда несколько горутин одновременно обращаются к общим данным, и хотя бы одна из них выполняет запись. Для обнаружения можно:
- Использовать
-raceфлаг при запуске или тестировании:
go run -race main.go
go test -race ./...
- Искать места с общим доступом к переменным без синхронизации:
var counter int
func increment() {
counter++ // потенциальная гонка
}
- Проверять использование каналов, мьютексов или других примитивов синхронизации:
var mu sync.Mutex
func safeIncrement() {
mu.Lock()
defer mu.Unlock()
counter++ // безопасно
}
Race detector в Go отлично помогает находить такие проблемы, но не гарантирует обнаружение всех случаев. Лучшая практика - проектировать код так, чтобы минимизировать общее состояние между горутинами.