Sobes.tech
Middle+

Kas nutiks, jei skaitytojas uždarys kanalą, o rašytojas vis dar rašo? Kaip išvengti panikos?

sobes.tech AI

Atsakymas iš AI

Jei skaitytojas uždarys kanalą, o rašytojas toliau rašys į jį, Go kalboje įvyks panika (panic) su pranešimu "send on closed channel".

Norint išvengti šios panikos, galima:

  • Naudoti papildomą žymeklį arba kanalą signaluoti uždarymą, kad rašytojas žinotų, jog kanalas uždarytas ir liautųsi rašyti.
  • Uždaryti kanalą tik po to, kai visi rašytojai baigs darbą, pavyzdžiui, naudojant sync.WaitGroup.
  • Naudoti recover panikai valdyti, bet tai nerekomenduojama kaip pagrindinis būdas.

Saugus kanalo uždarymo pavyzdys:

ch := make(chan int)
var wg sync.WaitGroup

wg.Add(1)
go func() {
    defer wg.Done()
    for i := 0; i < 10; i++ {
        ch <- i
    }
}()

// Uždaryti kanalą po rašytojo pabaigos
ngo func() {
    wg.Wait()
    close(ch)
}()

for val := range ch {
    fmt.Println(val)
}

Šiuo būdu, kanalas uždaromas tik po to, kai visi įrašai baigti, ir skaitytojas gali saugiai skaityti iki uždarymo.