Циклы и функции

Цикл for: три формы, break и continue

Содержание курса

break и continue: досрочный выход и пропуск итерации

break и continue управляют ходом выполнения цикла, но делают это по-разному.

break немедленно завершает ближайшую охватывающую конструкцию — это может быть for, switch или select. Важно: если break стоит внутри switch, вложенного в цикл, он завершит switch, а не цикл. Мы разбирали switch в прошлом уроке — теперь это различие становится практически значимым.

continue, в отличие от break, относится только к циклу — к ближайшему охватывающему for. Он прерывает текущую итерацию и переходит к следующей. Но «следующая итерация» — это не просто начало тела. В форме с постшагом for i := 0; i < n; i++ после continue сначала выполняется i++, и только затем проверяется условие. Это принципиально.

for i := 0; i < 5; i++ {
    if i == 2 {
        continue
    }
    fmt.Println(i)
}

Вывод:

0
1
3
4

Когда i равно 2, continue пропускает fmt.Println, но i++ всё равно выполняется — поэтому следующая итерация начнётся с i = 3, а не зависнет на i = 2. Цикл не стал бесконечным.

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

Вывод:

0
1
2

Как только i достигает 3, цикл завершается полностью — постшаг не выполняется, условие не проверяется.

Если циклы вложены, оба оператора без метки действуют на внутренний цикл — тот, в теле которого они стоят. Внешний цикл продолжается. Это отдельно от ситуации со switch: break внутри switch всегда завершает switch, даже если снаружи есть цикл — на цикл такой break не влияет.