В Go есть два подхода к синхронизации:
1. Share memory by communicating (каналы):
ch := make(chan Result)
go func() { ch <- compute() }()
result := <-ch
2. Communicate by sharing memory (мьютексы):
var mu sync.RWMutex
mu.Lock()
sharedData = newValue
mu.Unlock()
Полный список примитивов:
sync.Mutex/sync.RWMutex— защита shared statechannels— передача данных между горутинамиsync.WaitGroup— ожидание группы горутинsync.Once— однократная инициализацияsync/atomic— атомарные операции (быстрее мьютекса для простых счётчиков)sync.Map— concurrent-safe mapcontext.Context— отмена, таймаутыsync.Pool— пул переиспользуемых объектов