Найти тему
Я, Golang-инженер

#19. Golang break

Это статья об основах программирования. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.

Хой, джедаи и амазонки! В этой статье расскажу любопытное наблюдение об операторе break в switch.

В руководствах о выражении break говорится, что оно останавливает цикл, в который вложен, и, как правило, применяется с условным выражением if.

Смоделируем ситуацию: в цикле (назовём его циклом первого порядка) есть вложенный цикл (цикл второго порядка). Когда оператор break используется в цикле второго порядка, то остановка будет выполнена именно для него, а не для цикла первого порядка. Цикл первого порядка продолжит свою работу. Вроде бы всё логично. Идём дальше.

Возьмём операторы if и switch. У них сходные функции. Разница в том, что switch+break ведёт себя с оператором break, как вложенный цикл - т.е. не прекращает работу цикла, в который входит, а прекращает как бы сам себя. Этой информации я не видел в статьях по break. А конструкция if+break прекращает работу цикла, в который входит. Пример кода:

Пример кода
Пример кода

Программа выведет в терминал такой результат:

Пример вывода в терминал
Пример вывода в терминал

Мы видим, что при достижении значения i := 1 в операторе switch выражение break не остановил цикл, но остановил switch. В то время, как при достижении значения i := 3 в операторе if, выражение break остановило цикл.

Вспомним, что break - избыточный инструмент в Golang, т.к. его можно заменить через принудительное изменение переменной-счётчика, от которой зависит цикл. В данном случае от i. Если мы в switch так и поступим, то цикл остановится.

Пример кода
Пример кода

Результат выполнения кода

Вывод в терминал
Вывод в терминал

Итог: иногда нужно остановить работу цикла, при достижении определённых значений в switch. В этом случае нельзя использовать break, а нужно присваивать значение переменой-счётчику. Зная это вы сэкономите время в разборе, почему программа может работать неправильно.

Дополнение статьи

Пообщался с куратором, которого мне назначила школа Skillbox. Он предложил вариант решения задачи с помощью метки, чтобы не усложнять код:

Решение задачи с меткой
Решение задачи с меткой

В этом случае вывод будет следующим:

Вывод в терминал
Вывод в терминал

Метка после оператора break прерывает внешний цикл. Ещё нашёл информацию в технической документации по Go, что break прекращает работу операторов for, switch и select. С последним пока не знаком.

Mindspace Studio https://unsplash.com/photos/knW4wDXEbsI
Mindspace Studio https://unsplash.com/photos/knW4wDXEbsI

Бро, ты уже здесь? 👉 Подпишись на канал «Я, Golang-инженер», будем изучать IT вместе 👨‍💻👩‍💻👨‍💻