В Go каналы бывают нескольких типов, и они отличаются по состоянию и поведению:
Чем отличается nil канал от закрытого, открытого и буферизированного в Go?
В Go каналы бывают нескольких типов, и они отличаются по состоянию и поведению:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Go каналы бывают нескольких типов, и они отличаются по состоянию и поведению:
- nil канал — это канал, который не инициализирован (имеет значение
nil). Любая операция отправки или получения на таком канале блокируется навсегда, что часто используется для динамического управления select. - открытый канал — это обычный канал, на который можно отправлять и с которого можно получать значения.
- закрытый канал — канал, на котором вызвана функция
close(). После закрытия нельзя отправлять значения, но можно получать оставшиеся значения из буфера, а затем получать нулевые значения без блокировки. - буферизированный канал — канал с буфером, который позволяет отправлять несколько значений без блокировки, пока буфер не заполнится.
Пример:
var ch chan int // nil канал
ch = make(chan int) // открытый небуферизированный канал
ch = make(chan int, 5) // буферизированный канал с размером буфера 5
close(ch) // закрытый канал