Ответ
Буферизованные и небуферизованные каналы в Go различаются поведением при отправке и получении данных:
Небуферизованный канал (make(chan T)):
- Отправка блокируется, пока данные не будут получены
- Получение блокируется, пока не поступят данные
- Обеспечивает синхронизацию горутин
ch := make(chan int) // небуферизованный
go func() { ch <- 1 }()
fmt.Println(<-ch) // 1
Буферизованный канал (make(chan T, N)):
- Отправка блокируется только при заполнении буфера
- Получение блокируется только при пустом буфере
- Позволяет асинхронную работу
ch := make(chan int, 2) // буферизованный (емкость 2)
ch <- 1
ch <- 2
fmt.Println(<-ch, <-ch) // 1 2
Выбор зависит от требований к синхронизации и производительности.