Sobes.tech
Junior — Middle

Hogyan viselkedik a program, amikor range-et használ zárt, nem pufferelt csatornából olvasásra?

sobes.tech MI

Válasz az MI-től

Go-ban, amikor range-et használunk egy csatornáról való olvasáshoz, a ciklus értékeket kap a csatornáról, amíg az be nem zárul. Ha a csatorna zárva van, és minden érték olvasva lett, a range befejezi a ciklust.

A nem pufferelt csatornára ugyanez igaz, mint a puffereltre: ha a csatorna zárva van, a range nem blokkol és kilép a ciklusból.

Példa:

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

for v := range ch {
    fmt.Println(v) // Kiírja 1 és 2, majd a ciklus véget ér
}

Ha a csatorna zárva van, de nincs benne adat, a range azonnal befejeződik. Ha a csatorna nincs zárva, de nincs benne adat, a range vár (blokkol) addig, amíg adat nem érkezik vagy a csatorna be nem zárul.