Sobes.tech
Назад к вопросам
Middle+
3

Если читатель закрывает канал, а писатель ещё пишет — что произойдёт? Как избежать паники?

Компании, где спрашивали
Астрал-Софт

Ответ от нейросети

sobes.tech AI

Если читатель закрывает канал, а писатель продолжает писать в него, то в Go произойдёт паника (panic) с сообщением "send on closed channel".

Чтобы избежать этой паники, можно:

  • Использовать дополнительный флаг или канал для сигнала о закрытии, чтобы писатель знал, что канал закрыт и перестал писать.
  • Закрывать канал только после того, как все писатели завершили работу, например, с помощью sync.WaitGroup.
  • Использовать recover для обработки паники, но это не рекомендуется как основной способ.

Пример безопасного закрытия канала:

ch := make(chan int)
var wg sync.WaitGroup

wg.Add(1)
go func() {
    defer wg.Done()
    for i := 0; i < 10; i++ {
        ch <- i
    }
}()

// Закрываем канал после того, как писатель закончит
go func() {
    wg.Wait()
    close(ch)
}()

for val := range ch {
    fmt.Println(val)
}

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