Junior — Middle
Jak se chová program při použití range pro čtení z uzavřeného, nebufferovaného kanálu?
sobes.tech AI
Odpověď od AI
Při použití range ke čtení z kanálu v Go, bude smyčka přijímat hodnoty z kanálu, dokud nebude kanál uzavřen. Pokud je kanál uzavřen a všechny hodnoty již byly přečteny, range smyčku ukončí.
Pro nebufferovaný kanál to funguje stejně jako pro bufferovaný: pokud je kanál uzavřen, range se nezablokuje a opustí smyčku.
Příklad:
ch := make(chan int)
func() {
ch <- 1
ch <- 2
close(ch)
}()
for v := range ch {
fmt.Println(v) // Vytiskne 1 a 2, pak se smyčka ukončí
}
Pokud je kanál uzavřen, ale nemá žádná data, range se ihned ukončí. Pokud není uzavřen, ale nemá data, range bude čekat (zablokuje se) do příchodu dat nebo uzavření kanálu.