Middle+
Šta će se dogoditi ako čitalac zatvori kanal, a pisac još uvek piše? Kako izbeći paniku?
sobes.tech АИ
Одговор од АИ
Ако читаоцу затворите канал, а писац продолжи да пише у њега, у Go ће се десити паника (panic) са поруком "send on closed channel".
Да бисте избегли ову панiku, можете:
- Користити додатну флаг или канал за сигнал о затварању, да би писац знао да је канал затворен и престао да пише.
- Затворити канал само након што су сви писци завршили рад, на пример, коришћењем
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
}
}()
// Затворите канал након што писац заврши
ngo func() {
wg.Wait()
close(ch)
}()
for val := range ch {
fmt.Println(val)
}
На овај начин, канал се затвара само након што су све записе завршене, и читаоцу је безбедно да чита до затварања.