Значение само по себе ничего не говорит. Если по каналу
chan int пришёл 0, это может быть и реально отправленный ноль, и нулевое значение типа после закрытия. Поэтому в Go для приёма есть вторая переменная.v, ok := <-ch
if !ok {
// канал закрыт и полностью вычитан
return
}
fmt.Println(v)
ok равен false только тогда, когда канал закрыт и в буфере ничего не осталось. Пока в буфере есть данные, приём из закрытого канала возвращает их с ok == true. То есть закрытие не отбрасывает уже отправленные значения.🐸 Библиотека Go для собеса