Поиск…


Вступление

Как одна из самых основных функций в программировании, петли - важная часть почти для каждого языка программирования. Петли позволяют разработчикам устанавливать определенные части своего кода для повторения через несколько циклов, которые называются итерациями. В этом разделе описывается использование нескольких типов циклов и приложений циклов в Go.

Базовый цикл

for - единственный оператор цикла в go, поэтому реализация базового цикла может выглядеть так:

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

Перерыв и продолжение

Выход из цикла и продолжение следующей итерации также поддерживается в Go, как и на многих других языках:

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 и continue дополнительно принимают необязательную метку, используемую для идентификации внешних циклов для таргетинга с помощью оператора:

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

Условный цикл

Ключевое слово for также используется для условных циклов, традиционно в while циклы на других языках программирования.

package main

import (
    "fmt"
)

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

играть на детской площадке

Вывод:

1
2
3

бесконечный цикл:

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

Различные формы для цикла

Простая форма с использованием одной переменной:

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

Использование двух переменных (или более):

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

Без использования инструкции инициализации:

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

Без тестового выражения:

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

Без выражения increment:

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

Когда все три выражения инициализации, теста и приращения удаляются, цикл становится бесконечным:

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

Это пример бесконечного цикла с счетчиком, инициализированным нулем:

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

Когда используется только тестовое выражение (действует как типичный цикл while):

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

Использование выражения только increment:

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

Итерация по диапазону значений с использованием индекса и значения:

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

Итерируйте по диапазону, используя только индекс:

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

Итерируйте по диапазону, используя только индекс:

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

Итерации по диапазону с использованием только значения:

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

Итерация по диапазону с использованием ключа и значения для карты (может быть не в порядке):

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

Итерации по диапазону, используя только ключ для карты (может быть не в порядке):

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

Итерации по диапазону, используя только ключ для карты (может быть не в порядке):

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

Итерация по диапазону с использованием только значения для карты (может быть не в порядке):

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

Итерация по диапазону для каналов (выходы, если канал закрыт):

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

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

Итерация по диапазону для строки (дает кодовые точки 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

как вы видите, utf8str имеет 6 рун (кодовые точки Юникода) и 7 байт.

Временная петля

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow