Go by Example - IT: Range sui Channel

In un esempio precedente, abbiamo visto come for e range ci diano la possibilità di iterare su strutture di dati semplici. Possiamo usare la stessa sintassi anche per iterare sui valori ricevuti da un channel.

package main
import "fmt"
func main() {

Itereremo su 2 valori nel canale queue.

    queue := make(chan string, 2)
    queue <- "one"
    queue <- "two"
    close(queue)

Questo range reitera su ogni elemento ogni qual volta che viene ricevuto dal channel queue. Poiché abbiamo effettuato un close sul canale in precedenza, la iterazione terminerà dopo aver ricevuto i 2 elementi. Se non avessimo effettuato il close sul canale, allora saremmo bloccati ad attendere per un terzo futuro valore

    for elem := range queue {
        fmt.Println(elem)
    }
}
$ go run range-over-channels.go
one
two

Questo esempio ci ha dimostrato che è comunque possibile chiudere un canale non vuoto e ricevere i valori rimanenti.

Prossimo esempio: Timer.