Поиск…
Вступление
Как одна из самых основных функций в программировании, петли - важная часть почти для каждого языка программирования. Петли позволяют разработчикам устанавливать определенные части своего кода для повторения через несколько циклов, которые называются итерациями. В этом разделе описывается использование нескольких типов циклов и приложений циклов в 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")
}
}