Чем отличается nil канал от закрытого, открытого и буферизированного в Go?

В Go каналы бывают нескольких типов, и они отличаются по состоянию и поведению:

Короткий ответ

Что ответить на собеседовании

В Go каналы бывают нескольких типов, и они отличаются по состоянию и поведению:

Подробный разбор

Ответ с пояснениями

В Go каналы бывают нескольких типов, и они отличаются по состоянию и поведению:

  • nil канал — это канал, который не инициализирован (имеет значение nil). Любая операция отправки или получения на таком канале блокируется навсегда, что часто используется для динамического управления select.
  • открытый канал — это обычный канал, на который можно отправлять и с которого можно получать значения.
  • закрытый канал — канал, на котором вызвана функция close(). После закрытия нельзя отправлять значения, но можно получать оставшиеся значения из буфера, а затем получать нулевые значения без блокировки.
  • буферизированный канал — канал с буфером, который позволяет отправлять несколько значений без блокировки, пока буфер не заполнится.

Пример:

var ch chan int       // nil канал
ch = make(chan int)   // открытый небуферизированный канал
ch = make(chan int, 5) // буферизированный канал с размером буфера 5
close(ch)             // закрытый канал

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее