В чем разница между ответом Zero Value из закрытого канала и аналогичным самостоятельно созданным ответом

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

Ответ

При чтении из закрытого канала всегда получаем zero-value типа канала, но есть ключевые отличия:

  1. Закрытый канал:
ch := make(chan int)
close(ch)
val, ok := <-ch  // val=0, ok=false (ok показывает, что канал закрыт)
  1. Zero-value канала:
var ch chan int
val, ok := <-ch  // val=0, ok=false (но это deadlock!)

Основные различия:

  • Закрытый канал можно читать многократно (всегда zero-value + ok=false)
  • Чтение из nil-канала блокирует горутину навсегда (deadlock)
  • Закрытый канал можно закрыть повторно (panic), nil-канал закрыть нельзя (panic)