Назад к вопросам
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)
}
Таким образом, канал закрывается только после того, как все записи завершены, и читатель может безопасно читать до закрытия.