Recherche…


Introduction

En tant que l'une des fonctions les plus élémentaires de la programmation, les boucles constituent une partie importante de presque tous les langages de programmation. Les boucles permettent aux développeurs de définir certaines parties de leur code à répéter à travers un certain nombre de boucles appelées itérations. Cette rubrique traite de l'utilisation de plusieurs types de boucles et d'applications de boucles dans Go.

Boucle de base

for est la seule instruction de boucle en cours, donc une implémentation de boucle de base pourrait ressembler à ceci:

// like if, for doesn't use parens either.
// variables declared in for and if are local to their scope.
for x := 0; x < 3; x++ { // ++ is a statement.
    fmt.Println("iteration", x)
}

// would print:
// iteration 0
// iteration 1
// iteration 2

Pause et Continuation

Sortir de la boucle et continuer à la prochaine itération est également pris en charge dans Go, comme dans de nombreuses autres langues:

for x := 0; x < 10; x++ { // loop through 0 to 9
    if x < 3 { // skips all the numbers before 3
        continue
    } 
    if x > 5 { // breaks out of the loop once x == 6
        break
    }
    fmt.Println("iteration", x)
}

// would print:
// iteration 3
// iteration 4
// iteration 5

Les instructions break et continue acceptent en outre une étiquette facultative, utilisée pour identifier les boucles externes à cibler avec l'instruction:

OuterLoop:
for {
    for {
        if allDone() {
            break OuterLoop
        }
        if innerDone() {
            continue OuterLoop
        }
        // do something
    }
}

Boucle conditionnelle

Le for mot - clé est également utilisé pour les boucles conditionnelles, traditionnellement while boucles dans d' autres langages de programmation.

package main

import (
    "fmt"
)

func main() {
    i := 0
    for i < 3 { // Will repeat if condition is true
        i++
        fmt.Println(i)
    }
}

jouer sur le terrain de jeu

Va sortir:

1
2
3

boucle infinie:

for {
    // This will run until a return or break.
}

Différentes formes de For Loop

Forme simple utilisant une variable:

for i := 0; i < 10; i++ {
    fmt.Print(i, " ")
}

En utilisant deux variables (ou plus):

for i, j := 0, 0; i < 5 && j < 10; i, j = i+1, j+2 {
    fmt.Println(i, j)
}

Sans utiliser l'instruction d'initialisation:

i := 0
for ; i < 10; i++ {
    fmt.Print(i, " ")
}

Sans expression de test:

for i := 1; ; i++ {
    if i&1 == 1 {
        continue
    }
    if i == 22 {
        break
    }
    fmt.Print(i, " ")
}

Sans expression d'incrément:

for i := 0; i < 10; {
    fmt.Print(i, " ")
    i++
}

Lorsque toutes les trois expressions d'initialisation, de test et d'incrémentation sont supprimées, la boucle devient infinie:

i := 0
for {
    fmt.Print(i, " ")
    i++
    if i == 10 {
        break
    }
}

Voici un exemple de boucle infinie avec compteur initialisé à zéro:

for i := 0; ; {
    fmt.Print(i, " ")
    if i == 9 {
        break
    }
    i++
}

Lorsque seule l'expression de test est utilisée (agit comme une boucle while typique):

i := 0
for i < 10 {
    fmt.Print(i, " ")
    i++
}

En utilisant uniquement l'expression d'incrémentation:

i := 0
for ; ; i++ {
    fmt.Print(i, " ")
    if i == 9 {
        break
    }
}

Itérer sur une plage de valeurs en utilisant un index et une valeur:

ary := [5]int{0, 1, 2, 3, 4}
for index, value := range ary {
    fmt.Println("ary[", index, "] =", value)
}

Itérer sur une plage en utilisant juste l'index:

for index := range ary {
    fmt.Println("ary[", index, "] =", ary[index])
}

Itérer sur une plage en utilisant juste l'index:

for index, _ := range ary {
    fmt.Println("ary[", index, "] =", ary[index])
}

Itérer sur une plage en utilisant simplement la valeur:

for _, value := range ary {
    fmt.Print(value, " ")
}

Itérer sur une plage en utilisant la clé et la valeur pour la carte (peut ne pas être dans l'ordre):

mp := map[string]int{"One": 1, "Two": 2, "Three": 3}
for key, value := range mp {
    fmt.Println("map[", key, "] =", value)
}

Itérer sur une plage en utilisant simplement la touche pour la carte (peut ne pas être dans l'ordre):

for key := range mp {
    fmt.Print(key, " ") //One Two Three
}

Itérer sur une plage en utilisant simplement la touche pour la carte (peut ne pas être dans l'ordre):

for key, _ := range mp {
    fmt.Print(key, " ") //One Two Three
}

Itérer sur une plage en utilisant juste la valeur pour la carte (peut ne pas être dans l'ordre):

for _, value := range mp {
    fmt.Print(value, " ") //2 3 1
}

Itérer sur une plage pour les canaux (quitte si le canal est fermé):

ch := make(chan int, 10)
for i := 0; i < 10; i++ {
    ch <- i
}
close(ch)

for i := range ch {
    fmt.Print(i, " ")
}

Itérer sur une plage pour la chaîne (donne les points de code Unicode):

utf8str := "B = \u00b5H" //B = µH
for _, r := range utf8str {
    fmt.Print(r, " ") //66 32 61 32 181 72
}
fmt.Println()
for _, v := range []byte(utf8str) {
    fmt.Print(v, " ") //66 32 61 32 194 181 72
}
fmt.Println(len(utf8str)) //7

comme vous le voyez, utf8str a 6 runes (points de code Unicode) et 7 octets.

Boucle chronométrée

package main

import(
    "fmt"
    "time"
)

func main() {
    for _ = range time.Tick(time.Second * 3) {
        fmt.Println("Ticking every 3 seconds")
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow