Ответ
Основные структуры для передачи данных между горутинами в Go:
- Каналы (chan) - основной способ коммуникации. Бывают буферизированные и небуферизированные:
ch := make(chan int) // небуферизированный
ch := make(chan int, 10) // буферизированный
- sync.Mutex/sync.RWMutex - для защиты общих структур данных:
var mu sync.Mutex
mu.Lock()
// работа с общими данными
mu.Unlock()
- sync.WaitGroup - для ожидания завершения группы горутин:
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// работа
}()
wg.Wait()
- sync.Map - конкурентно-безопасная версия map (используется реже, когда нужна именно map-структура)
Каналы являются идиоматичным способом для Go, реализующим модель CSP (Communicating Sequential Processes). Мьютексы стоит использовать для защиты состояний, а не для коммуникации.