Какие знаешь примитивы работы с горутинами

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

Ответ

В Go основные примитивы для работы с горутинами:

  1. Каналы (channels) - для коммуникации между горутинами:
ch := make(chan int)
go func() { ch <- 42 }()
val := <-ch
  1. WaitGroup - ожидание завершения группы горутин:
var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    // работа
}()
wg.Wait()
  1. Mutex/RWMutex - синхронизация доступа к общим данным:
var mu sync.Mutex
var counter int
mu.Lock()
counter++
mu.Unlock()
  1. Once - гарантированное однократное выполнение:
var once sync.Once
once.Do(func() { /* инициализация */ })
  1. Select - мультиплексирование каналов:
select {
case <-ch1:
case ch2 <- val:
default:
    // если каналы не готовы
}
  1. Context - для отмены и таймаутов:
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()