Sobes.tech
Junior — Middle

Hoe gedraagt het programma zich bij het gebruik van range om te lezen uit een gesloten, niet-buffered kanaal?

sobes.tech AI

Antwoord van AI

Bij het gebruik van range om uit een kanaal in Go te lezen, ontvangt de lus waarden uit het kanaal totdat het gesloten wordt. Als het kanaal gesloten is en alle waarden zijn gelezen, zal range de lus beëindigen.

Voor een niet-buffered kanaal werkt dit hetzelfde als voor een gebufferd kanaal: als het kanaal gesloten is, blokkeert range niet en verlaat de lus.

Voorbeeld:

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

for v := range ch {
    fmt.Println(v) // Drukt 1 en 2 af, daarna eindigt de lus
}

Als het kanaal gesloten is, maar er geen data in zit, eindigt range onmiddellijk. Als het kanaal niet gesloten is, maar geen data heeft, wacht range (blokkeert) tot data arriveert of het kanaal wordt gesloten.