Цикл for: три формы, break и continue
Содержание курса
В прошлом уроке мы разбирали if и switch — инструменты для ветвления. Теперь добавим повторение: for в Go — единственный цикл, но он достаточно гибок, чтобы заменить и while, и бесконечный цикл с флагом выхода.
Три формы цикла for: синтаксис и механизм выполнения
Go не имеет while или do-while — только for. Зато у него три формы записи, и каждая уместна в своей ситуации.
Форма с инициализатором, условием и постшагом — то, что в других языках называют классическим for:
for i := 0; i < 5; i++ {
fmt.Println(i)
}
Порядок выполнения фиксирован: сначала один раз выполняется инициализатор i := 0, затем перед каждой итерацией проверяется условие i < 5, и только если оно истинно — выполняется тело. После тела — постшаг i++, и снова проверка условия. Когда условие становится ложным, цикл завершается.
Важная деталь: переменная i, объявленная через := в инициализаторе, существует только внутри цикла. За его пределами она недоступна. Это не ограничение, а разумная область видимости — счётчик цикла редко нужен после его завершения.
Ещё одна особенность Go: i++ — это инструкция, а не выражение. Написать j := i++ не получится — компилятор откажет. Это сделано намеренно, чтобы устранить целый класс ошибок вроде a[i++] = i++.
Форма только с условием — аналог while:
n := 1
for n < 100 {
n *= 2
}
fmt.Println(n) // 128
Здесь нет инициализатора и постшага — только условие. Переменная n объявлена до цикла, потому что её значение нужно после выхода.
Бесконечный цикл — форма вообще без условия:
for {
// выполняется бесконечно
}
Выйти из него можно только явно: через break, return или в экстремальных случаях os.Exit. Именно эта форма удобна, когда условие выхода проверяется не в заголовке цикла, а где-то в середине тела — что и понадобится в итоговом примере урока.
Во всех трёх формах тело цикла обязательно заключено в фигурные скобки — без исключений, как и в if.
