Sobes.tech
Junior — Middle

Ako sa správa program pri použití range na čítanie zo zatvoreného, nebufferovaného kanála?

sobes.tech AI

Odpoveď od AI

Pri použití range na čítanie z kanála v Go, bude slučka prijímať hodnoty z kanála, kým nebude kanál zatvorený. Ak je kanál zatvorený a všetky hodnoty už boli prečítané, range ukončí slučku.

Pre nebufferovaný kanál to funguje rovnako ako pre bufferovaný: ak je kanál zatvorený, range sa nezablokuje a opustí slučku.

Príklad:

ch := make(chan int)
func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // Vytlačí 1 a 2, potom sa slučka ukončí
}

Ak je kanál zatvorený, ale nemá žiadne dáta, range sa okamžite ukončí. Ak nie je zatvorený, ale nemá dáta, range bude čakať (zablokuje sa) do príchodu dát alebo zatvorenia kanála.