Этот вопрос проверяет понимание работы каналов в Go и синхронизации между горутинами.
Небуферизованный канал блокирует отправителя до получения значения, а получателя — до отправки. Буферизованный позволяет отправлять несколько значений, пока буфер не заполнится.
Каналы — основной способ синхронизации горутин в Go.
Небуферизованный канал (make(chan int)) передаёт значение только при одновременном send и receive. Это обеспечивает строгую синхронизацию.
Буферизованный канал (make(chan int, N)) хранит до N значений. Отправитель блокируется только если буфер заполнен, а получатель — если буфер пуст.
ch := make(chan int, 2) // буфер на 2
ch <- 1
ch <- 2
// третья отправка заблокируется, пока не будет чтенияВывод:
небуферизованные каналы хороши для строгой синхронизации;
буферизованные — для балансировки нагрузки и очередей.