Passer au contenu principal
eLearner.app
Module 2 · Leçon 3 sur 58/50 dans le cours~10 min
Leçons du module (3/5)

for...range

for ... range est la manière idiomatique de parcourir les collections : tranches, tableaux, cartes, chaînes et canaux. La syntaxe change légèrement selon les collections, mais le motif de base est toujours le même : for key, value := range coll { ... }.

Plage sur les tranches et les tableaux

Renvoie index et copie de la valeur :

Go
nums := []int{10, 20, 30}
for i, v := range nums {
    fmt.Println(i, v)
}
// 0 10
// 1 20
// 2 30

Souvent, une des deux suffit :

Go
// solo indice
for i := range nums { _ = i }

// solo valore (ignora indice con _)
for _, v := range nums { _ = v }

Plage sur une carte

Renvoie clé et valeur :

Go
prices := map[string]int{"pane": 2, "latte": 3, "vino": 8}
for k, v := range prices {
    fmt.Println(k, v)
}

Plage sur une chaîne : des runes, pas des octets

for i, r := range s itère par point de code Unicode (rune), pas par octet. L'index i est le décalage d'octet du début de la rune.

Go
for i, r := range "èé" {
    fmt.Printf("%d %c (%U)\n", i, r, r)
}
// 0 è (U+00E8)
// 2 é (U+00E9)

Pour itérer par octet, utilisez l'indexation classique :

Go
s := "ciao"
for i := 0; i < len(s); i++ {
    fmt.Println(s[i])  // byte (uint8)
}

Portée sur une chaîne

Itère jusqu'à ce que le canal soit fermé :

Go
ch := make(chan int)
go func() {
    for i := 0; i < 3; i++ { ch <- i }
    close(ch)
}()
for v := range ch {
    fmt.Println(v)
}

Nous approfondirons le module Concurrency.

Essayez-le

Exercice#go.m2.l3.e1
Tentatives : 0Chargement…

Imprimer l'index et la valeur de chaque élément de nums en utilisant for-range.

Chargement de l'éditeur…

Solution disponible après 3 tentatives

Exercice#go.m2.l3.e2
Tentatives : 0Chargement…

Additionnez au total toutes les valeurs de nombres en ignorant l'index.

Chargement de l'éditeur…
Afficher l'indice

Utilisez `_` pour supprimer l'index.

Solution disponible après 3 tentatives

Quiz#go.m2.l3.e3
Prêt

Que représente la première variable de `for k, v := range m` lorsque m est une carte ?

Go
m := map[string]int{"a": 1, "b": 2}
for k, v := range m { fmt.Println(k, v) }
Options de réponse

Récapitulatif

  • for k, v := range coll avec portée claire : jetez avec _ ce que vous n'utilisez pas.
  • Slice/array : index + COPIE de la valeur. Pour muter, indexez.
  • Carte : clé + valeur, ordre randomisé à chaque exécution.
  • Chaîne : la plage s'itère par rune (point de code), et non par octet.
  • Channel : itère pendant que le canal est ouvert ; fermé avec close().