Какие структуры используются для передачи данных из одной горутины в другую

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

Ответ

Основные структуры для передачи данных между горутинами в Go:

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

Каналы являются идиоматичным способом для Go, реализующим модель CSP (Communicating Sequential Processes). Мьютексы стоит использовать для защиты состояний, а не для коммуникации.