Цикл for
Чему вы научитесь:
- повторять код циклом
forв трёх формах: с тремя частями, с одним условием и без условия; - выходить из цикла через
breakи пропускать проход черезcontinue; - повторять действие
nраз с помощьюfor i := range n.

Строка 1 + 2 + … + 100 складывает числа от 1 до 100, но все сто слагаемых пришлось бы набирать вручную. Для повторяющихся действий есть цикл — конструкция, которая выполняет код снова и снова, пока истинно условие.
Представьте бегуна на стадионе. Тренер говорит: «Бегай круги, пока не пробежишь сто». Перед каждым новым кругом бегун проходит контрольную арку, где сверяется со счётом, пробегает круг и делает отметку в блокноте. Цикл устроен так же. В Go для циклов есть единственное ключевое слово — for:
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++выполняется после тела — отметка в блокноте.
Один проход тела называют итерацией. Давайте разберём программу по строкам:
s := 0заводит сумму.for i := 1; i <= 100; i++повторяет тело, покаiне станет равной101.s += iзначит то же, чтоs = s + i: к сумме добавляется очередноеi.fmt.Println(s)выполняется после цикла и печатает5050.
Условие задаёт число итераций. С условием i < 5 тело выполняется для 1, 2, 3 и 4, а при i, равной 5, условие уже ложно. Переменная i объявлена в заголовке, поэтому видна только внутри цикла.
В виджете тот же цикл с условием i <= 3: нажмите «Следующий шаг» и следите, когда выполняется каждая часть заголовка.
1–4package main · import "fmt"5func main() {6 s := 07 for i := 1; i <= 3; i++ {8 s += i9 }10 fmt.Println(s)11}
s := 0 заводит сумму.
Круглых скобок вокруг заголовка нет, а фигурные скобки вокруг тела обязательны, как в if. Эту форму берут, когда заранее известно, откуда и докуда считать.
Здесь картинка со стадионом неточна. Бегун пробегает хотя бы один круг, а цикл for проверяет условие ещё до первого прохода. Если оно ложно сразу, тело не выполнится ни разу.
Только условие
Цикл с одним условием пишут без инициализации, шага и точек с запятой — так в Go выглядит while. Переменную объявляют до цикла, а меняют в теле. Этот код считает, сколько раз 100 нужно разделить нацело на 2, чтобы осталась 1:
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:
func firstSquareOver(limit int) int {
n := 1
for {
if n*n > limit {
return n
}
n++
}
}Разберём, как она работает:
n := 1— поиск начинается с единицы.for {повторяет тело без всякой проверки.if n*n > limit— как только квадрат превысилlimit,return nзавершает и цикл, и функцию.n++переходит к следующему числу.
Например, для limit, равного 10, функция вернёт 4: 3*3 — это 9, а 4*4 — уже 16. Ловушка этой формы — выход: если условие внутри никогда не станет истинным, цикл не закончится.
Частая ошибка
В цикле с одним условием забыли изменить переменную:
i := 1
for i <= 3 { // ✗
fmt.Println(i)
}Переменная i в теле не меняется, поэтому условие i <= 3 истинно всегда, и программа печатает 1 без конца. Бегун забыл делать отметки и бежит вечно. В задачах курса такую программу останавливает ограничение по времени. Добавьте i++ в конец тела, и цикл напечатает 1, 2 и 3.
Главное
- В Go одно ключевое слово цикла —
for; отдельногоwhileнет. - Инициализация выполняется один раз, условие — перед каждой итерацией, шаг — после тела.
- Цикл с одним условием пишут как
for n > 1 { … }, а бесконечный — какfor { … }. - Переменную из условия нужно менять в теле, иначе цикл не закончится.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.