Это статья об основах программирования. На канале я рассказываю об опыте перехода в 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. С последним пока не знаком.
Бро, ты уже здесь? 👉 Подпишись на канал «Я, Golang-инженер», будем изучать IT вместе 👨💻👩💻👨💻