В чем разница между буферизованным и небуферизованным каналом

«В чем разница между буферизованным и небуферизованным каналом» — вопрос из категории Golang, который задают на 41% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Буферизованные и небуферизованные каналы в 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

Выбор зависит от требований к синхронизации и производительности.