Sobes.tech
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)
}

На овај начин, канал се затвара само након што су све записе завршене, и читаоцу је безбедно да чита до затварања.