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