Что происходит при чтении из закрытого канала

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

Ответ

При чтении из закрытого канала возвращается нулевое значение типа канала и false как второе значение, указывающее на отсутствие данных. Это позволяет отличить реальные нулевые значения от случая закрытого канала.

ch := make(chan int)
close(ch)
val, ok := <-ch
// val = 0, ok = false

Важные моменты:

  1. Чтение из закрытого канала не вызывает паники
  2. Операция всегда немедленно возвращает управление
  3. Если канал буферизованный, сначала будут прочитаны все оставшиеся значения, затем вернутся нулевые значения

Пример с буферизованным каналом:

ch := make(chan int, 2)
ch <- 1
ch <- 2
close(ch)
// Сначала прочитаем 1 и 2, затем нулевые значения