Небуферизованный канал (make(chan int)) — синхронный: отправитель блокируется, пока получатель не прочитает. Буферизованный (make(chan int, 10)) — асинхронный до заполнения буфера.
ch1 := make(chan int) // блокирует на send до receive
ch2 := make(chan int, 5) // блокирует только когда буфер полон
Небуферизованные гарантируют синхронизацию — отправитель знает, что данные получены. Буферизованные дают развязку по времени — отправитель может уйти дальше. Используй небуферизованные для сигналов и синхронизации, буферизованные — для пулов задач и rate limiting.