Range Sui Channel

Range sui Channel #

// In un [esempio precedente](range), 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.