Ответ
В Golang запись в закрытый канал вызывает панику. Чтобы избежать этого:
- Используйте
recover()в горутине, где возможна запись:
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
ch <- data // безопасная запись
}()
- Лучшая практика - явно контролировать состояние канала:
select {
case ch <- data:
// успешная запись
default:
// канал заблокирован (не путать с закрытым)
}
- Используйте sync.Once для однократного закрытия канала и избегайте повторных закрытий.
Важно: архитектурно лучше, чтобы закрывал канал только его создатель, а другие горутины лишь читали/писали.