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.