Sobes.tech
Junior — Middle

Jaké důsledky nastanou, pokud kanál po použití nezavřete?

sobes.tech AI

Odpověď od AI

Pokud v Go nezavřete kanál po jeho použití, mohou nastat následující důsledky:

  • Blokování gorutin: Pokud jiné gorutiny čekají na data z kanálu a ten není uzavřen, mohou čekat do nekonečna, protože nedostanou signál o ukončení přenosu.
  • Úniky zdrojů: Ačkoliv samotný kanál nevyžaduje explicitní uvolnění paměti, nezavřený kanál může vést k logickým chybám a zaseknutí programu.
  • Nemožnost správně zpracovat konec přenosu: Uzavřený kanál umožňuje použití konstrukcí jako for range nebo kontrolu ok k určení, že data skončila. Bez uzavření to není možné.

Příklad správného uzavření kanálu:

ch := make(chan int)
go func() {
    defer close(ch)
    for i := 0; i < 5; i++ {
        ch <- i
    }
}()

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

Zde je kanál uzavřen po odeslání všech hodnot, což umožňuje správné ukončení cyklu range.