Ответ
Да, читать из закрытого канала можно. Эта операция никогда не блокируется и не вызывает панику. Поведение зависит от способа чтения:
-
С использованием второй переменной
ok
: Это идиоматический способ проверки, закрыт ли канал. Чтение из закрытого канала немедленно вернет нулевое значение для типа данных канала иfalse
для переменнойok
.ch := make(chan int, 1) ch <- 10 close(ch) val, ok := <-ch // val = 10, ok = true (сначала читаем оставшиеся данные) val, ok = <-ch // val = 0, ok = false (канал пуст и закрыт)
-
В цикле
for range
: Циклfor range
автоматически прекратит свою работу, когда канал будет закрыт и все значения из него будут прочитаны.ch := make(chan int, 2) ch <- 1 ch <- 2 close(ch) // Цикл напечатает 1 и 2, а затем завершится for v := range ch { fmt.Println(v) }
-
Без проверки
ok
: Если не использовать вторую переменную, вы будете бесконечно получать нулевые значения, что может привести к ошибкам в логике. Поэтому всегда проверяйте статус канала при чтении.