Le Go par l'exemple: Range sur des canaux

Dans un exemple précédent, nous avons vu comment for et range permettent d’itérer sur des structures de données simples. On peut également utiliser cette syntaxe pour itérer sur des valeurs reçues depuis un canal.

package main
import "fmt"
func main() {

Nous allons itérer sur 2 valeurs dans le canal queue.

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

Ce range itère sur chaque élément à mesure qu’il est reçu dans queue. Comme nous avons fermé le canal plus haut, l’itération se termine après réception des deux éléments. Si nous ne l’avions pas fermé, nous bloquerions sur la réception d’une troisième valeur dans la boucle.

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

Cet exemple montrait également comment il est possible de fermer un canal non vide tout en continuant à recevoir les valeurs restantes.

Exemple suivant: Timers.