← Назад к вопросам
Как работаешь с небуферизированным каналом?
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)