Как избегать панику при записи в закрытый канал

«Как избегать панику при записи в закрытый канал» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Golang запись в закрытый канал вызывает панику. Чтобы избежать этого:

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

Важно: архитектурно лучше, чтобы закрывал канал только его создатель, а другие горутины лишь читали/писали.