Ответ
Используйте примитивы синхронизации из пакета sync:
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Основные способы:
- Мьютексы (
sync.Mutex) - блокируют доступ к общим данным - RWMutex - для сценариев "много читателей, один писатель"
- Атомарные операции (
sync/atomic) - Каналы - для передачи данных между горутинами
Пример с атомарными операциями:
var counter int64
func increment() {
atomic.AddInt64(&counter, 1)
}
Лучшая практика - минимизировать общее состояние, использовать каналы и immutable структуры там, где возможно. Для обнаружения race conditions используйте go run -race.