Что произойдет при попытке записи в закрытый канал (channel) в Go?

Ответ

При попытке записи в закрытый канал в Go произойдет паника (panic).

Это сделано намеренно, чтобы предотвратить ошибки, когда отправитель пытается отправить данные в канал, который получатели уже не слушают. Такое поведение сигнализирует о серьезной ошибке в логике программы.

Пример:

package main

import "fmt"

func main() {
    ch := make(chan int, 1)
    close(ch)

    // Эта строка вызовет панику
    // panic: send on closed channel
    ch <- 42 
    fmt.Println("Это сообщение не будет выведено")
}

Ключевые моменты:

  1. Паника при записи: Запись в закрытый канал — это всегда паника.
  2. Чтение возможно: Чтение из закрытого канала панику не вызывает (см. отдельный вопрос).
  3. Паника при повторном закрытии: Попытка закрыть уже закрытый канал также вызывает панику (panic: close of closed channel).
  4. Кто закрывает канал? По общепринятому соглашению, канал должен закрывать только отправитель. Если у канала несколько отправителей, закрывать его должен тот, кто координирует их работу, или после того, как все отправители завершат свою работу (например, с помощью sync.WaitGroup).