Ricerca…


introduzione

Essendo una delle funzioni di base della programmazione, i loop sono un elemento importante in quasi tutti i linguaggi di programmazione. I loop consentono agli sviluppatori di impostare alcune parti del loro codice per ripetere attraverso un numero di cicli che vengono definiti iterazioni. Questo argomento riguarda l'utilizzo di più tipi di loop e applicazioni di loop in Go.

Loop di base

for è l'unica istruzione di loop in go, quindi l'implementazione di un ciclo di base potrebbe assomigliare a questa:

// 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

Rompere e continuare

L'interruzione del ciclo e il passaggio alla successiva iterazione sono supportati anche in Go, come in molte altre lingue:

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

Le istruzioni break e continue accettano inoltre un'etichetta facoltativa, utilizzata per identificare i loop esterni per il target con l'istruzione:

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

Ciclo condizionale

La parola chiave for viene anche utilizzata per i loop condizionali, tradizionalmente while loop si trovano in altri linguaggi di programmazione.

package main

import (
    "fmt"
)

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

giocarci sul campo da gioco

Produrrà:

1
2
3

ciclo infinito:

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

Diverse forme di loop

Forma semplice usando una variabile:

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

Utilizzando due variabili (o più):

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

Senza usare la dichiarazione di inizializzazione:

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

Senza un'espressione test:

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

Senza espressione di incremento:

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

Quando vengono rimosse tutte e tre le espressioni di inizializzazione, test e incremento, il ciclo diventa infinito:

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

Questo è un esempio di loop infinito con contatore inizializzato con zero:

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

Quando viene utilizzata solo l'espressione di test (si comporta come un tipico ciclo while):

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

Usando solo l'espressione di incremento:

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

Iterare su un intervallo di valori usando indice e valore:

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

Iterare su un intervallo usando solo indice:

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

Iterare su un intervallo usando solo indice:

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

Iterare su un intervallo usando il valore giusto:

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

Iterare su un intervallo utilizzando la chiave e il valore per la mappa (potrebbe non essere in ordine):

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

Iterare su un intervallo utilizzando solo il tasto per la mappa (potrebbe non essere in ordine):

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

Iterare su un intervallo utilizzando solo il tasto per la mappa (potrebbe non essere in ordine):

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

Iterare su un intervallo utilizzando solo il valore per la mappa (potrebbe non essere in ordine):

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

Iterare su un intervallo per i canali (esce se il canale è chiuso):

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

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

Iterare su un intervallo per stringa (fornisce punti codice 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

come vedi utf8str ha 6 rune (punti codice Unicode) e 7 byte.

Ciclo temporizzato

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow