Что произойдет при чтении данных из закрытого канала в Go?

Ответ

Да, читать из закрытого канала можно. Эта операция никогда не блокируется и не вызывает панику. Поведение зависит от способа чтения:

  1. С использованием второй переменной 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 (канал пуст и закрыт)
  2. В цикле for range: Цикл for range автоматически прекратит свою работу, когда канал будет закрыт и все значения из него будут прочитаны.

    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    close(ch)
    
    // Цикл напечатает 1 и 2, а затем завершится
    for v := range ch {
        fmt.Println(v)
    }
  3. Без проверки ok: Если не использовать вторую переменную, вы будете бесконечно получать нулевые значения, что может привести к ошибкам в логике. Поэтому всегда проверяйте статус канала при чтении.