Какими единицами оперирует многопоточность в Go

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

Ответ

В Go многопоточность работает с горутинами (goroutines) — легковесными потоками, управляемыми рантаймом Go. Они не являются потоками ОС, а работают поверх них (M:N модель).

Основные единицы:

  • Горутина — функция, выполняющаяся конкурентно. Запускается через go func().
  • Каналы (channels) — механизм связи между горутинами (chan).
  • Примитивы синхронизации из пакета sync (Mutex, WaitGroup и т.д.).

Пример:

func main() {
    ch := make(chan int)
    go func() { ch <- 42 }() // горутина
    fmt.Println(<-ch) // синхронизация через канал
}

Горутины дешевле потоков ОС (стек ~2 КБ, динамически растёт). Планировщик Go распределяет их по потокам ОС.