Sobes.tech
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.