← Назад к вопросам

Как работаешь с небуферизированным каналом?

2.0 Middle🔥 191 комментариев
#Конкурентность и горутины#Основы Go

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Небуферизированные каналы

Фундаментальный концепт Go для синхронизации между горутинами.

Что это?

канал без буфера: ch := make(chan int)

Отправитель БЛОКИРУЕТ пока получатель не получит данные.

Как работает

Отправитель -ch <- 42-> БЛОКИРУЕТ ждёт получателя

         ^                              |
         ├──────  Получатель <-ch ──────┘
         РАЗБЛОКИРУЕТ

Пример синхронизации

ch := make(chan string)

go func() {
    ch <- "Hello"  // Блокирует до получения
}()

msg := <-ch  // Получает и разблокирует

Пример worker pool

jobs := make(chan int)
results := make(chan int)

go worker(jobs, results)

jobs <- 1      // Блокирует
result := <-results  // Получает

Синхронизация завершения

done := make(chan struct{})

go func() {
    // работа
    done <- struct{}{}  // Блокирует
}()

<-done  // Ждём горутину

Pipeline паттерн

stage1 -> ch1 -> stage2 -> ch2 -> stage3

Каждая стадия блокирует пока следующая не получит.

Частая ошибка: Deadlock

ch := make(chan int)
ch <- 42  // Deadlock! Нет получателя

Горетины ДОЛЖНЫ быть запущены до отправки!

Close канала

close(ch) - закрывает канал

Отправка в закрытый канал = panic Получение из закрытого = zero value

Используй когда

  • Синхронизация результатов
  • Координация горутин
  • Pipeline обработки
  • Ждём завершения работы

vs Буферизированный

Небуферизированный: отправитель блокирует Буферизированный: отправитель не блокирует (до capacity)