Sök…


Introduktion

Som en av de mest grundläggande funktionerna i programmering är slingor en viktig del för nästan alla programmeringsspråk. Loops gör det möjligt för utvecklare att ställa in vissa delar av sin kod för att upprepa genom ett antal slingor som kallas iterationer. Detta ämne täcker användning av flera typer av slingor och applikationer av slingor i Go.

Grundläggande slinga

for är det enda slutsatsen som går, så en grundläggande slingimplementering kan se ut så här:

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

Bryt och fortsätt

Att gå ut ur slingan och fortsätta till nästa iteration stöds också i Go, som på många andra språk:

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

Uttalningarna om att break och continue accepterar dessutom en valfri etikett som används för att identifiera yttre slingor som du kan rikta in sig med uttalandet:

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

Villkorlig slinga

Den for sökord används också för villkorliga loopar, traditionellt while slingor i andra programmeringsspråk.

package main

import (
    "fmt"
)

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

spela det på lekplatsen

Kommer att matas ut:

1
2
3

oändlig loop:

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

Olika former för för ögla

Enkel form med en variabel:

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

Använda två variabler (eller mer):

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

Utan att använda initialiseringssats:

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

Utan ett testuttryck:

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

Utan stegvis uttryck:

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

När alla tre initialiserings-, test- och steguttryck tas bort blir slingan oändlig:

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

Detta är ett exempel på oändlig slinga med räknaren initialiserad med noll:

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

När bara testuttrycket används (fungerar som en typisk medan-loop):

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

Använd bara stegvis uttryck:

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

Iterera över en rad värden med index och värde:

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

Iterera över ett intervall med bara index:

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

Iterera över ett intervall med bara index:

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

Iterera över ett intervall med bara värde:

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

Iterera över ett intervall med nyckel och värde för karta (kanske inte i ordning):

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

Iterera över ett intervall med bara tangent för karta (kanske inte är i ordning):

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

Iterera över ett intervall med bara tangent för karta (kanske inte är i ordning):

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

Iterera över ett intervall med bara värde för karta (kanske inte i ordning):

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

Iterera över ett område för kanaler (går ut om kanalen är stängd):

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

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

Iterera över ett intervall för sträng (ger Unicode-kodpoäng):

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

som du ser utf8str har 6 runor (Unicode-kodpunkter) och 7 byte.

Tidsstyrd slinga

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow