Szukaj…


Wprowadzenie

Jako jedna z najbardziej podstawowych funkcji programowania, pętle są ważnym elementem w prawie każdym języku programowania. Pętle umożliwiają programistom ustawianie określonych części kodu na powtarzanie się przez szereg pętli zwanych iteracjami. W tym temacie omówiono korzystanie z wielu rodzajów pętli i aplikacji pętli w Go.

Podstawowa pętla

for jest jedyną instrukcją pętli w go, więc podstawowa implementacja pętli może wyglądać następująco:

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

Przerwij i kontynuuj

Wyjście z pętli i przejście do następnej iteracji jest również obsługiwane w Go, podobnie jak w wielu innych językach:

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

break i continue oświadczenia dodatkowo przyjąć opcjonalną etykietę, używany do identyfikacji zewnętrzne pętle na cel ze stwierdzeniem:

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

Pętla warunkowa

Słowo kluczowe for jest również używane w pętlach warunkowych, tradycyjnie while pętli w innych językach programowania.

package main

import (
    "fmt"
)

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

zagraj na placu zabaw

Wyjdzie:

1
2
3

nieskończona pętla:

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

Różne formy pętli

Prosty formularz z jedną zmienną:

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

Używanie dwóch zmiennych (lub więcej):

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

Bez użycia instrukcji inicjalizacji:

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

Bez wyrażenia testowego:

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

Bez wyrażenia przyrostowego:

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

Po usunięciu wszystkich trzech wyrażeń inicjalizacyjnych, testowych i wyrażeń przyrostowych pętla staje się nieskończona:

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

To jest przykład nieskończonej pętli z licznikiem zainicjowanym zerem:

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

Gdy używane jest tylko wyrażenie testowe (działa jak typowa pętla while):

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

Używając wyrażenia tylko inkrementacyjnego:

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

Iteruj w zakresie wartości, używając indeksu i wartości:

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

Iteruj po zakresie, używając tylko indeksu:

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

Iteruj po zakresie, używając tylko indeksu:

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

Iteruj po zakresie, używając tylko wartości:

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

Iteruj po zakresie, używając klucza i wartości dla mapy (może nie być w porządku):

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

Iteruj w całym zakresie, używając tylko klucza do mapy (może nie być w porządku):

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

Iteruj w całym zakresie, używając tylko klucza do mapy (może nie być w porządku):

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

Iteruj po zakresie, używając tylko wartości dla mapy (może nie być w porządku):

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

Iteracja w zakresie dla kanałów (wyjście, jeśli kanał jest zamknięty):

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

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

Iteruj po zakresie dla ciągu (daje punkty kodu 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

jak widać utf8str ma 6 run (punkty kodowe Unicode) i 7 bajtów.

Pętla czasowa

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow