Ответ
При попытке записи в закрытый канал в Go произойдет паника (panic
).
Это сделано намеренно, чтобы предотвратить ошибки, когда отправитель пытается отправить данные в канал, который получатели уже не слушают. Такое поведение сигнализирует о серьезной ошибке в логике программы.
Пример:
package main
import "fmt"
func main() {
ch := make(chan int, 1)
close(ch)
// Эта строка вызовет панику
// panic: send on closed channel
ch <- 42
fmt.Println("Это сообщение не будет выведено")
}
Ключевые моменты:
- Паника при записи: Запись в закрытый канал — это всегда паника.
- Чтение возможно: Чтение из закрытого канала панику не вызывает (см. отдельный вопрос).
- Паника при повторном закрытии: Попытка закрыть уже закрытый канал также вызывает панику (
panic: close of closed channel
). - Кто закрывает канал? По общепринятому соглашению, канал должен закрывать только отправитель. Если у канала несколько отправителей, закрывать его должен тот, кто координирует их работу, или после того, как все отправители завершат свою работу (например, с помощью
sync.WaitGroup
).