Какие коммуникации можно строить между горутинами

«Какие коммуникации можно строить между горутинами» — вопрос из категории Golang, который задают на 24% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go горутины могут общаться через:

  1. Каналы (channels) - основной способ. Типизированные "трубы" для передачи данных. Могут быть буферизированными или нет.
ch := make(chan int)
go func() { ch <- 42 }()
value := <-ch
  1. Синхронизация (sync пакет) - Mutex, WaitGroup, Atomic для координации:
var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); /* работа */ }()
wg.Wait()
  1. Контекст (context) - для отмены и таймаутов:
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
  1. Shared memory - общая память (но требует синхронизации!)
  2. Select - мультиплексирование каналов
  3. Sync.Cond - условные переменные для сложных сценариев ожидания

Каналы - идиоматичный подход, рекомендуемый Go. Остальные методы - для специфичных случаев.