Цикл for

Цикл в Go — это способ многократно выполнить один и тот же блок кода без копипасты, управляя числом повторений через счётчик и условие.

Структура цикла for

Базовый синтаксис:

for init; condition; post {
    // тело цикла
}
  • init — инициализация счётчика (обычно i := 0 или i := 1).
  • condition — условие продолжения цикла (i <= 5, i < 10).
  • post — приращение счётчика (i++, i += 2, i--).

Пример:

for i := 1; i <= 5; i++ {
    fmt.Printf("%d ", i)
}

Область видимости счётчика

Если счётчик объявлен в init:

for i := 10; i <= 12; i++ {
    fmt.Printf("i = %d\n", i)
}
// Здесь i уже недоступна

Переменная i видна только внутри цикла. Если нужно использовать её снаружи — объявляйте до цикла:

i := 0
for ; i < 3; i++ {
    fmt.Println(i)
}
// Здесь i доступна

Разные шаги и направления

Приращение можно настраивать:

// Шаг +1
for i := 0; i < 5; i++ {}

// Шаг +2
for i := 0; i < 10; i += 2 {}

// Шаг -1 (обратный отсчёт)
for i := 5; i >= 1; i-- {}

Go не имеет отдельного «цикла вниз» — направление задаётся стартовым значением, условием и шагом.

Вариации синтаксиса

Можно опускать части заголовка:

// Без init (i объявлена заранее)
i := 0
for ; i < 3; i++ {
    fmt.Println(i)
}

// Без post (приращение внутри тела)
for j := 0; j < 3; {
    fmt.Println(j)
    j++
}

Главное — чтобы на каждой итерации условие в condition в какой‑то момент стало ложным, иначе будет бесконечный цикл.

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

Один цикл можно разместить внутри другого:

for i := 1; i <= 3; i++ {
    for j := 1; j <= 3; j++ {
        product := i * j
        fmt.Printf("%d*%d=%d  ", i, j, product)
    }
    fmt.Println()
}

Внешний цикл управляет строками, внутренний — столбцами. Такое часто используется для таблиц, матриц, комбинаторики.

Практика: сумма чисел

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

sum := 0
for i := 1; i <= 10; i++ {
    sum += i
    fmt.Printf("i=%d, sum=%d\n", i, sum)
}
fmt.Printf("Итого: %d\n", sum)

Цикл — оператор, внутри которого можно использовать другие операторы (включая циклы). Чтобы понимать поведение сложных (особенно вложенных) циклов, полезно прогонять код пошагово в дебаггере и на каждой итерации отслеживать значения счётчиков и накопленных переменных.