Цикл for
Цикл for - это единственная циклическая конструкция в языке Go.
В отличие от многих других языков, в Go нет циклов while или do-while -
вместо них используется for с различными формами записи.
Цикл for позволяет выполнять блок кода многократно,
пока выполняется определенное условие, или перебирать элементы коллекций.
Синтаксис
Базовый синтаксис цикла for включает три компонента:
инициализацию, условие и пост-выражение, разделенные точкой с запятой.
for init; condition; post {
// body
}
Где:
init - инициализация переменной счетчика
condition - условие продолжения цикла
post - выражение, выполняемое после каждой итерации
Все три компонента являются необязательными.
Стандартный цикл for
Самый распространенный вариант - цикл с инициализацией, условием и пост-выражением, как в языках C и Java.
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Println(i)
}
}
Результат выполнения кода:
0
1
2
3
4
Цикл while (for с условием)
В Go отсутствует ключевое слово while.
Для создания цикла, выполняющегося пока условие истинно,
используется for с одним условием (без инициализации и пост-выражения).
package main
import "fmt"
func main() {
count := 0
for count < 3 {
fmt.Println("Iteration:", count)
count++
}
}
Результат выполнения кода:
"Iteration: 0"
"Iteration: 1"
"Iteration: 2"
Бесконечный цикл
Если опустить условие, получится бесконечный цикл.
Для выхода из такого цикла используется ключевое слово break.
package main
import "fmt"
func main() {
count := 0
for {
fmt.Println("Loop iteration:", count)
count++
if count >= 3 {
break
}
}
}
Результат выполнения кода:
"Loop iteration: 0"
"Loop iteration: 1"
"Loop iteration: 2"
Перебор элементов массива и слайса
Для перебора элементов коллекций используется конструкция
for range, которая возвращает индекс и значение элемента.
package main
import "fmt"
func main() {
nums := []int{1, 2, 3, 4, 5}
for index, value := range nums {
fmt.Println(index, value)
}
}
Результат выполнения кода:
"0 1"
"1 2"
"2 3"
"3 4"
"4 5"
Если индекс не нужен, его можно пропустить с помощью символа подчеркивания.
package main
import "fmt"
func main() {
nums := []int{1, 2, 3, 4, 5}
for _, value := range nums {
fmt.Println("Value:", value)
}
}
Результат выполнения кода:
"Value: 1"
"Value: 2"
"Value: 3"
"Value: 4"
"Value: 5"
Перебор строки
При переборе строки с помощью for range
возвращаются кодовые точки Unicode (руны), а не байты.
package main
import "fmt"
func main() {
str := "abcde"
for index, runeValue := range str {
fmt.Printf("%d: %c\n", index, runeValue)
}
}
Результат выполнения кода:
"0: a"
"1: b"
"2: c"
"3: d"
"4: e"
Перебор map
Цикл for range используется и для перебора элементов map,
возвращая ключ и значение.
package main
import "fmt"
func main() {
m := map[string]int{"a": 1, "b": 2, "c": 3}
for key, value := range m {
fmt.Println(key, value)
}
}
Результат выполнения кода (порядок может быть случайным):
"a 1"
"b 2"
"c 3"
Использование continue
Ключевое слово continue позволяет пропустить текущую итерацию
и перейти к следующей.
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
if i%2 == 0 {
continue
}
fmt.Println("Odd number:", i)
}
}
Результат выполнения кода:
"Odd number: 1"
"Odd number: 3"
Использование break
Ключевое слово break используется для досрочного выхода из цикла.
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
break
}
fmt.Println(i)
}
}
Результат выполнения кода:
0
1
2
3
4
Вложенные циклы
Циклы могут быть вложенными друг в друга.
При этом break и continue влияют только на самый внутренний цикл.
package main
import "fmt"
func main() {
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
fmt.Printf("%d,%d ", i, j)
}
fmt.Println()
}
}
Результат выполнения кода:
"0,0 0,1 0,2 "
"1,0 1,1 1,2 "
"2,0 2,1 2,2 "