Junior — Middle
Kaip elgiasi programa, naudojant range skaityti iš uždaro, nebuferinio kanalo?
sobes.tech AI
Atsakymas iš AI
Naudojant range skaityti iš kanalo Go kalboje, ciklas gaus reikšmes iš kanalo iki tol, kol jis nebus uždarytas. Jei kanalas uždarytas ir visos reikšmės jau perskaitytos, range užbaigs ciklą.
Be buferio kanalas veikia taip pat kaip ir su buferiu: jei kanalas uždarytas, range neblokuojasi ir išeina iš ciklo.
Pavyzdys:
ch := make(chan int)
func() {
ch <- 1
ch <- 2
close(ch)
}()
for v := range ch {
fmt.Println(v) // Išves 1 ir 2, tada ciklas baigsis
}
Jei kanalas uždarytas, bet jame nėra duomenų, range iš karto baigsis. Jei kanalas nėra uždarytas, bet duomenų nėra, range lauks (blokuosis) iki duomenys pasirodys arba kanalas bus uždarytas.