Ответ
При чтении из закрытого канала всегда получаем zero-value типа канала, но есть ключевые отличия:
- Закрытый канал:
ch := make(chan int)
close(ch)
val, ok := <-ch // val=0, ok=false (ok показывает, что канал закрыт)
- Zero-value канала:
var ch chan int
val, ok := <-ch // val=0, ok=false (но это deadlock!)
Основные различия:
- Закрытый канал можно читать многократно (всегда zero-value + ok=false)
- Чтение из nil-канала блокирует горутину навсегда (deadlock)
- Закрытый канал можно закрыть повторно (panic), nil-канал закрыть нельзя (panic)