Sobes.tech
Junior — Middle

Aké dôsledky nastanú, ak po použití nezavriete kanál?

sobes.tech AI

Odpoveď od AI

Ak nezavriete kanál v Go po jeho použití, môžu nastať nasledovné dôsledky:

  • Blokovanie gorút: Ak iné gorutiny čakajú na dáta z kanála a ten nie je zatvorený, môžu čakať do nekonečna, pretože nedostanú signál o ukončení prenosu.
  • Úniky zdrojov: Hoci samotný kanál nevyžaduje explicitné uvoľnenie pamäte, nezatvorený kanál môže viesť k logickým chybám a zaseknutiu programu.
  • Nemožnosť správneho spracovania konca prenosu: Zatvorený kanál umožňuje použitie konštrukcií ako for range alebo kontrolu ok na určenie, že dáta skončili. Bez zatvorenia to nie je možné.

Príklad správneho zatvorenia kanála:

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

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

Tu je kanál zatvorený po odoslaní všetkých hodnôt, čo umožňuje správne ukončenie cyklu range.