Ответ
В Go проблема data race решается с помощью примитивов синхронизации из пакета sync:
- Мьютексы (
sync.Mutex,sync.RWMutex) - базовый способ:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
counter++
mu.Unlock()
}
- Атомарные операции (
sync/atomic):
var counter int64
func increment() {
atomic.AddInt64(&counter, 1)
}
- Каналы - идиоматичный способ для Go:
ch := make(chan int, 1)
// Запись
ch <- value
// Чтение
value := <-ch
Для обнаружения гонок используйте флаг -race:
go run -race main.go
Выбор метода зависит от контекста: атомарные операции для простых случаев, мьютексы для сложных структур, каналы для коммуникации между горутинами.