Range sur des canaux
#
// Dans un exemple [précédent](range), 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.