Junior — Middle
Cum se comportă programul atunci când folosește range pentru a citi dintr-un canal închis, ne-bufferizat?
sobes.tech AI
Răspuns de la AI
Atunci când folosești range pentru a citi dintr-un canal în Go, bucla va primi valori din canal până când acesta va fi închis. Dacă canalul este închis și toate valorile au fost citite, range va încheia bucla.
Pentru un canal fără buffer, funcționează la fel ca pentru unul cu buffer: dacă canalul este închis, range nu se blochează și iese din buclă.
Exemplu:
ch := make(chan int)
func() {
ch <- 1
ch <- 2
close(ch)
}()
for v := range ch {
fmt.Println(v) // Va afișa 1 și 2, apoi bucla se va încheia
}
Dacă canalul este închis, dar nu are date, range se va încheia imediat. Dacă canalul nu este închis, dar nu are date, range va aștepta (se va bloca) până când vor apărea date sau canalul va fi închis.