Middle+
Kaj se zgodi, če bralec zapre kanal, medtem ko pisec še piše? Kako se izogniti panični?
sobes.tech AI
Odpoveď od AI
Ak čitateľ zatvorí kanál a spisovateľ naň stále píše, v Go dôjde k panike (panic) s hláškou "send on closed channel".
Aby ste sa tejto panike vyhli, môžete:
- Použiť ďalší príznak alebo kanál na signalizáciu zatvorenia, aby spisovateľ vedel, že kanál je zatvorený a prestal písať.
- Zatvoriť kanál až po tom, čo všetci spisovatelia dokončia prácu, napríklad pomocou
sync.WaitGroup. - Použiť recover na spracovanie paniky, ale to sa neodporúča ako hlavný spôsob.
Príklad bezpečného zatvorenia kanála:
ch := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
}()
// Zatvoriť kanál po tom, čo spisovateľ skončí
ngo func() {
wg.Wait()
close(ch)
}()
for val := range ch {
fmt.Println(val)
}
Týmto spôsobom sa kanál zatvorí iba po tom, čo všetky zápisy skončia, a čitateľ môže bezpečne čítať až do zatvorenia.