> Как работает оператор break в цикле и какой будет вывод (Go)

Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Лига Цифровой Экономики

Стек: Go

> Пример ответа

Короткий ответ

Оператор break немедленно прерывает выполнение ближайшего цикла for, switch или select и передаёт управление на инструкцию после него. В циклах for он завершает итерации полностью, а не пропускает текущую. Если внутри цикла есть switch или select, break без метки прервёт именно их, а не внешний цикл. Для выхода из внешнего цикла нужна метка.

Подробное объяснение

В Go break относится к ближайшей охватывающей конструкции, которая поддерживает прерывание: for, switch или select. Внутри for он завершает цикл досрочно, независимо от условия в заголовке. Это отличается от continue, который пропускает оставшуюся часть текущей итерации и переходит к следующей. Если break находится внутри switch или select, вложенного в for, то без метки он прервёт только switch или select, а цикл продолжит работу. Чтобы прервать внешний цикл, используется метка: break Loop. Метка ставится перед циклом, а break указывает на неё. Также break можно использовать в for range, и он остановит перебор элементов. Важно, что break не возвращает значение и не влияет на отложенные вызовы defer - они выполнятся при выходе из функции.

На практике

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

Пример кода

GO
package main
import "fmt"
func main() {
// break в for
for i := 0; i < 5; i++ {
if i == 3 {
break
}
fmt.Println(i)
}
// Вывод: 0 1 2
// break в switch внутри for
for i := 0; i < 3; i++ {
switch i {
case 1:
break // прерывает switch, не for
}
fmt.Println("after switch", i)
}
// Вывод: after switch 0, after switch 1, after switch 2
// break с меткой для выхода из внешнего цикла
Loop:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break Loop
}
fmt.Println(i, j)
}
}
// Вывод: 0 0, 0 1, 0 2, 1 0
}

Как отвечать на собеседовании

Стоит сразу сказать, что break прерывает ближайший for, switch или select. Затем уточнить разницу с continue и поведение внутри вложенных конструкций. Показать пример с меткой для выхода из внешнего цикла. Отметить, что break в switch внутри for не завершает цикл. Если спросят про вывод, проговорить порядок итераций и момент прерывания. Упомянуть, что defer всё равно выполнится при выходе из функции.

Что проверяет интервьюер

Понимание области действия break и его отличия от continue. Умение работать с вложенными циклами и метками. Знание поведения break в switch и select. Способность предсказать вывод кода без запуска. Внимание к деталям: break не влияет на defer и не возвращает значение.

Типичные ошибки

Ожидание, что break внутри switch прервёт внешний for. Использование break без метки для выхода из вложенных циклов. Путаница между break и continue. Забывание, что break в select завершает только select. Неверный прогноз вывода из-за непонимания момента прерывания.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью