Цикл for

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

Синтаксис

Базовый синтаксис цикла for включает три компонента: инициализацию, условие и пост-выражение, разделенные точкой с запятой.

gofor init; condition; post {
  // body
}

Где:

goinit    - инициализация переменной счетчика
condition - условие продолжения цикла
post    - выражение, выполняемое после каждой итерации

Все три компонента являются необязательными.

Стандартный цикл for

Самый распространенный вариант - цикл с инициализацией, условием и пост-выражением, как в языках C и Java.

gopackage main

import "fmt"

func main() {
  for i := 0; i < 5; i++ {
    fmt.Println(i)
  }
}

Результат выполнения кода:

go0
1
2
3
4

Цикл while (for с условием)

В Go отсутствует ключевое слово while. Для создания цикла, выполняющегося пока условие истинно, используется for с одним условием (без инициализации и пост-выражения).

gopackage main

import "fmt"

func main() {
  count := 0
  for count < 3 {
    fmt.Println("Iteration:", count)
    count++
  }
}

Результат выполнения кода:

go"Iteration: 0"
"Iteration: 1"
"Iteration: 2"

Бесконечный цикл

Если опустить условие, получится бесконечный цикл. Для выхода из такого цикла используется ключевое слово break.

gopackage main

import "fmt"

func main() {
  count := 0
  for {
    fmt.Println("Loop iteration:", count)
    count++
    if count >= 3 {
      break
    }
  }
}

Результат выполнения кода:

go"Loop iteration: 0"
"Loop iteration: 1"
"Loop iteration: 2"

Перебор элементов массива и слайса

Для перебора элементов коллекций используется конструкция for range, которая возвращает индекс и значение элемента.

gopackage main

import "fmt"

func main() {
  nums := []int{1, 2, 3, 4, 5}
  for index, value := range nums {
    fmt.Println(index, value)
  }
}

Результат выполнения кода:

go"0 1"
"1 2"
"2 3"
"3 4"
"4 5"

Если индекс не нужен, его можно пропустить с помощью символа подчеркивания.

gopackage main

import "fmt"

func main() {
  nums := []int{1, 2, 3, 4, 5}
  for _, value := range nums {
    fmt.Println("Value:", value)
  }
}

Результат выполнения кода:

go"Value: 1"
"Value: 2"
"Value: 3"
"Value: 4"
"Value: 5"

Перебор строки

При переборе строки с помощью for range возвращаются кодовые точки Unicode (руны), а не байты.

gopackage main

import "fmt"

func main() {
  str := "abcde"
  for index, runeValue := range str {
    fmt.Printf("%d: %c\n", index, runeValue)
  }
}

Результат выполнения кода:

go"0: a"
"1: b"
"2: c"
"3: d"
"4: e"

Перебор map

Цикл for range используется и для перебора элементов map, возвращая ключ и значение.

gopackage main

import "fmt"

func main() {
  m := map[string]int{"a": 1, "b": 2, "c": 3}
  for key, value := range m {
    fmt.Println(key, value)
  }
}

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

go"a 1"
"b 2"
"c 3"

Использование continue

Ключевое слово continue позволяет пропустить текущую итерацию и перейти к следующей.

gopackage main

import "fmt"

func main() {
  for i := 0; i < 5; i++ {
    if i%2 == 0 {
      continue
    }
    fmt.Println("Odd number:", i)
  }
}

Результат выполнения кода:

go"Odd number: 1"
"Odd number: 3"

Использование break

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

gopackage main

import "fmt"

func main() {
  for i := 0; i < 10; i++ {
    if i == 5 {
      break
    }
    fmt.Println(i)
  }
}

Результат выполнения кода:

go0
1
2
3
4

Вложенные циклы

Циклы могут быть вложенными друг в друга. При этом break и continue влияют только на самый внутренний цикл.

gopackage 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()
  }
}

Результат выполнения кода:

go"0,0 0,1 0,2 "
"1,0 1,1 1,2 "
"2,0 2,1 2,2 "

Смотрите также

  • конструкцию if,
    которая выполняет код в зависимости от условия
  • конструкцию switch,
    которая выбирает один из нескольких вариантов выполнения
  • оператор break,
    который прерывает выполнение цикла
  • оператор continue,
    который переходит к следующей итерации цикла