Перейти к содержимому
Теория · Циклы · урок 1 из 8

Цикл for

Чему вы научитесь

Чему вы научитесь:

  • повторять код циклом for в трёх формах: с тремя частями, с одним условием и без условия;
  • выходить из цикла через break и пропускать проход через continue;
  • повторять действие n раз с помощью for i := range n.
Беговая дорожка: старт i := 1, контрольная арка i <= 100 перед кругом и отметка i++ в блокноте после круга

Строка 1 + 2 + … + 100 складывает числа от 1 до 100, но все сто слагаемых пришлось бы набирать вручную. Для повторяющихся действий есть цикл — конструкция, которая выполняет код снова и снова, пока истинно условие.

Представьте бегуна на стадионе. Тренер говорит: «Бегай круги, пока не пробежишь сто». Перед каждым новым кругом бегун проходит контрольную арку, где сверяется со счётом, пробегает круг и делает отметку в блокноте. Цикл устроен так же. В Go для циклов есть единственное ключевое слово — for:

GO
package main

import "fmt"

func main() {
    s := 0
    for i := 1; i <= 100; i++ {
        s += i
    }
    fmt.Println(s) // 5050
}

Три формы for

Отдельного слова while в Go нет. На собеседовании часто спрашивают, какие циклы есть в Go, и ждут именно этого: ключевое слово одно, for, а остальные виды циклов записывают через него. У for три формы, и каждая подходит для своей задачи.

С тремя частями

Заголовок цикла из примера состоит из трёх частей через точку с запятой:

  • инициализация i := 1 выполняется один раз, до начала цикла, — бегун выходит на старт;
  • условие i <= 100 проверяется перед каждым проходом — контрольная арка перед кругом;
  • шаг i++ выполняется после тела — отметка в блокноте.

Один проход тела называют итерацией. Давайте разберём программу по строкам:

  1. s := 0 заводит сумму.
  2. for i := 1; i <= 100; i++ повторяет тело, пока i не станет равной 101.
  3. s += i значит то же, что s = s + i: к сумме добавляется очередное i.
  4. fmt.Println(s) выполняется после цикла и печатает 5050.

Условие задаёт число итераций. С условием i < 5 тело выполняется для 1, 2, 3 и 4, а при i, равной 5, условие уже ложно. Переменная i объявлена в заголовке, поэтому видна только внутри цикла.

В виджете тот же цикл с условием i <= 3: нажмите «Следующий шаг» и следите, когда выполняется каждая часть заголовка.

ВживуюПорядок частей forшаг 1 из 13 · рамок: 1

s := 0 заводит сумму.

Рамка — место, где живут переменные одного вызова

Круглых скобок вокруг заголовка нет, а фигурные скобки вокруг тела обязательны, как в if. Эту форму берут, когда заранее известно, откуда и докуда считать.

Здесь картинка со стадионом неточна. Бегун пробегает хотя бы один круг, а цикл for проверяет условие ещё до первого прохода. Если оно ложно сразу, тело не выполнится ни разу.

Только условие

Цикл с одним условием пишут без инициализации, шага и точек с запятой — так в Go выглядит while. Переменную объявляют до цикла, а меняют в теле. Этот код считает, сколько раз 100 нужно разделить нацело на 2, чтобы осталась 1:

GO
n := 100
steps := 0
for n > 1 {
    n = n / 2
    steps++
}
fmt.Println(steps) // 6

Значения n идут так: 100, 50, 25, 12, 6, 3, 1. Шесть делений, и на 1 условие n > 1 становится ложным.

Эту форму берут, когда число повторений заранее неизвестно и зависит от того, что происходит в теле.

Без условия

Если убрать и условие, получится бесконечный цикл for { … }. Он повторяется, пока его не прервёт return. Эта функция ищет первое число, квадрат которого больше limit:

GO
func firstSquareOver(limit int) int {
    n := 1
    for {
        if n*n > limit {
            return n
        }
        n++
    }
}

Разберём, как она работает:

  1. n := 1 — поиск начинается с единицы.
  2. for { повторяет тело без всякой проверки.
  3. if n*n > limit — как только квадрат превысил limit, return n завершает и цикл, и функцию.
  4. n++ переходит к следующему числу.

Например, для limit, равного 10, функция вернёт 4: 3*3 — это 9, а 4*4 — уже 16. Ловушка этой формы — выход: если условие внутри никогда не станет истинным, цикл не закончится.

Частая ошибка

В цикле с одним условием забыли изменить переменную:

GO
i := 1
for i <= 3 { // ✗
    fmt.Println(i)
}

Переменная i в теле не меняется, поэтому условие i <= 3 истинно всегда, и программа печатает 1 без конца. Бегун забыл делать отметки и бежит вечно. В задачах курса такую программу останавливает ограничение по времени. Добавьте i++ в конец тела, и цикл напечатает 1, 2 и 3.

Главное

  • В Go одно ключевое слово цикла — for; отдельного while нет.
  • Инициализация выполняется один раз, условие — перед каждой итерацией, шаг — после тела.
  • Цикл с одним условием пишут как for n > 1 { … }, а бесконечный — как for { … }.
  • Переменную из условия нужно менять в теле, иначе цикл не закончится.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом