Каналы в Go: всё на собеседовании
Вопрос
Расскажите, как работают каналы в Go: виды, закрытие, поведение операций в разных состояниях, select и типичные ошибки.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Небуферизованный как точка синхронизации, буферизованный как очередь
Закрывает отправитель; чтение из закрытого даёт остаток, затем нулевое значение и ok=false
Отправка в закрытый и повторный close паникуют, nil-канал блокирует навсегда
select: случайный выбор готовой ветки, default, таймауты, nil для выключения ветки
Дедлоки и утечки горутин
Внутри hchan: кольцевой буфер, очереди ждущих, мьютекс
Что могут спросить следом
- Как сделать приоритет одного канала над другим в select?
- Когда лучше мьютекс, а не канал?
Разбор
Канал это типизированная очередь между горутинами с синхронизацией. Небуферизованный канал это рандеву: отправитель ждёт получателя, и в момент передачи обе горутины синхронизированы. Буферизованный работает как очередь фиксированной длины: отправка блокируется на полном буфере, чтение на пустом. Закрывает канал отправитель, когда больше ничего не пошлёт. После закрытия получатели дочитывают буфер, затем сразу получают нулевое значение с ok=false, и range завершается. Отправка в закрытый канал и повторное закрытие паникуют. nil-канал блокирует любую операцию навсегда, а close на нём паникует, зато nil удобно выключает ветку select. select ждёт первую готовую операцию, при нескольких готовых выбирает случайно, default делает его неблокирующим, а time.After или ctx.Done() дают таймаут. Типичные ошибки: дедлок при отправке без читателя, утечка горутины, которая пишет в канал, брошенный читателем, range по незакрытому каналу. Внутри канал это hchan: кольцевой буфер, очереди ждущих горутин и мьютекс. Каналы выбираю для передачи владения данными и сигналов, а для защиты общего состояния мьютекс проще.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.