Что произойдёт после выполнения выбранной ветви switch в Go, если явно не указано fallthrough?
После выполнения выбранной ветви switch управление покидает конструкцию. Следующая ветвь автоматически не запускается; переход к ней возможен только при явном использовании fallthrough.
Такое поведение делает переходы между ветвями явными и снижает риск случайного выполнения логики соседнего case. Если несколько вариантов должны обрабатываться одинаково, их можно объединить в одну ветвь, не дублируя код.
Ошибка возникает, когда разработчик ожидает поведение, привычное по некоторым языкам с неявным проваливанием между ветвями. В результате код после первого совпавшего case не выполняется, что может привести к неполному обновлению состояния, пропущенной валидации или неверному ответу обработчика.
В обычном switch Go проверяет ветви сверху вниз и выполняет тело первой совпавшей ветви. После завершения тела выполнение продолжается за пределами switch, даже если ниже есть другие совпадающие по смыслу ветви.
Программа напечатает только два. Оператор fallthrough безусловно передаёт управление следующей ветви, не проверяя её условие. Поэтому его следует применять осторожно: он связывает соседние ветви и может ухудшить читаемость. В type switch использовать fallthrough нельзя.
В обработчике статусов нужно для нескольких статусов выполнить одинаковую операцию. Возможны три подхода: дублировать тело ветвей, использовать fallthrough или объединить значения в одном case.
Дублирование проще читать локально, но создаёт риск расхождения логики. fallthrough экономит строки, однако его безусловная семантика может стать ошибкой при добавлении новой ветви. Предпочтительно объединить статусы в одну ветвь: это явно показывает, что для них намеренно выбрано одинаковое поведение, и не зависит от порядка соседних case.
Вопрос: Передаёт ли fallthrough управление следующей ветви только при совпадении её условия?
Ответ: Нет. После fallthrough выполняется тело непосредственно следующей ветви независимо от её выражения. Поэтому это не повторная проверка условий, а безусловный переход.
Вопрос: Можно ли использовать fallthrough в последней ветви обычного switch?
Ответ: Нет, переходить некуда. fallthrough должен вести к следующей ветви; в последней ветви такой оператор недопустим и приводит к ошибке компиляции.
Вопрос: Чем объединение нескольких значений в одном case безопаснее fallthrough?
Ответ: Объединённый case явно перечисляет все значения, для которых выполняется одно тело. Он не зависит от расположения других ветвей и не запускает логику следующего case побочно, поэтому изменение порядка или добавление ветвей не меняет поведение неожиданным образом.