Условия в Go: короткая инструкция для первых программ
Конструкции if, else if, else и switch в Go отличаются от привычных по Python или JavaScript. Разбираем синтаксис, инициализацию переменной прямо в условии и типичные ловушки — с рабочими примерами, которые можно запустить за минуту.

Что нужно до начала
Для запуска примеров достаточно одного из двух вариантов:
- Установленный Go 1.21+ (go.dev/dl). Проверка: команда
go versionв терминале выводит версию. - Браузер и Go Playground — ничего ставить не нужно, код выполняется онлайн.
Все примеры ниже написаны для Go 1.21+. Синтаксис условий не менялся с Go 1.0, поэтому они сработают и на более ранних версиях, но проверяли мы именно на 1.21.
Базовый if — без скобок, но с фигурными
Главное отличие от C, Java и JavaScript: круглые скобки вокруг условия не нужны, а фигурные — обязательны, даже для одной строки.
package main
import "fmt"
func main() {
temperature := 38.1
if temperature > 37.0 {
fmt.Println("Повышенная температура")
}
}
// Вывод: Повышенная температура
Проверка: скопируйте код в Go Playground, нажмите Run. Должна появиться строка «Повышенная температура».
Если добавить круглые скобки — if (temperature > 37.0) — компилятор не выдаст ошибку, но go vet и линтеры предупредят: в Go так не принято. Если убрать фигурные скобки — код не скомпилируется вовсе.
if-else и цепочка else if
Ключевое слово else обязано стоять на той же строке, что и закрывающая фигурная скобка предыдущего блока. Перенос на следующую строку — ошибка компиляции.
package main
import "fmt"
func main() {
score := 72
if score >= 90 {
fmt.Println("Отлично")
} else if score >= 70 {
fmt.Println("Хорошо")
} else if score >= 50 {
fmt.Println("Удовлетворительно")
} else {
fmt.Println("Неуд")
}
}
// Вывод: Хорошо
Проверка: смените score на 45 и запустите снова — вывод должен стать «Неуд».
Частая ошибка: else на новой строке
// Не скомпилируется!
if score >= 90 {
fmt.Println("Отлично")
}
else {
fmt.Println("Не отлично")
}
Компилятор скажет: syntax error: unexpected else, expected }. Go вставляет точку с запятой после } в конце строки, и else оказывается началом нового оператора.
Инициализация переменной прямо в if
Это конструкция, которой нет в большинстве языков, и ради неё стоит остановиться.
package main
import (
"fmt"
"strconv"
)
func main() {
raw := "256"
// val и err существуют только внутри if-else
if val, err := strconv.Atoi(raw); err != nil {
fmt.Println("Ошибка разбора:", err)
} else {
fmt.Println("Число:", val)
}
// fmt.Println(val) — ошибка компиляции: val не определена
}
// Вывод: Число: 256
Перед точкой с запятой — короткое объявление, после — само условие. Переменные val и err видны внутри всех веток if-else, но не за их пределами. Это сужает область видимости и уменьшает число «висящих» переменных в функции.
Инициализация в if — не синтаксический сахар, а инструмент контроля скоупа. В идиоматическом Go вы встретите её в каждом втором вызове, возвращающем ошибку: if err := doSomething(); err != nil { ... }.
switch — когда цепочка else if разрастается
В Go switch не требует break: каждый case завершается автоматически. Если нужно провалиться в следующий — используется явное ключевое слово fallthrough.
package main
import "fmt"
func main() {
day := "среда"
switch day {
case "понедельник", "вторник", "среда", "четверг", "пятница":
fmt.Println("Рабочий день")
case "суббота", "воскресенье":
fmt.Println("Выходной")
default:
fmt.Println("Неизвестный день")
}
}
// Вывод: Рабочий день
Обратите внимание: несколько значений в одном case перечисляются через запятую — отдельные блоки не нужны.
switch без выражения — замена длинного if-else
Если после switch не указать выражение, каждый case становится самостоятельным условием. Читается чище, чем цепочка else if.
package main
import "fmt"
func main() {
age := 30
switch {
case age < 13:
fmt.Println("Ребёнок")
case age < 18:
fmt.Println("Подросток")
case age < 65:
fmt.Println("Взрослый")
default:
fmt.Println("Пенсионер")
}
}
// Вывод: Взрослый
Сравнение if-else и switch
| Критерий | if / else if / else | switch |
|---|---|---|
| Количество веток | Удобен при 2–3 ветках | Читается лучше при 4+ ветках |
| Тип условия | Любое булево выражение | Сравнение с набором значений или произвольные условия (switch без выражения) |
| Автоматический break | Неприменимо | Да — каждый case завершается сам |
| Инициализация переменной | Да — перед условием через ; | Да — перед выражением через ; |
| Проваливание (fallthrough) | Неприменимо | Только явное, через ключевое слово fallthrough |
Если не получилось: типичные ошибки
- syntax error: unexpected else —
elseстоит на новой строке после}. Переместите} else {на одну строку. - non-boolean condition или cannot use ... as type bool — в Go нет «правдивости» числа или строки.
if count { ... }не работает, нужен явныйif count != 0 { ... }. - undefined: val после блока if — переменная, объявлённая в инициализации
if, не видна за его пределами. Объявите переменную доif, если она нужна дальше. - missing condition in if statement — забыли условие после
if. Проверьте, что междуifи{есть выражение, возвращающееbool. - fallthrough не делает то, что ожидалось —
fallthroughв switch переходит в следующийcaseбезусловно, не проверяя его условие. Это поведение отличается от C, где проваливание — поведение по умолчанию и тоже безусловное, но в Go оно удивляет тех, кто ожидает проверку.
Сноска: скоуп (scope) — область видимости переменной, то есть участок кода, в котором к ней можно обратиться. В Go фигурные скобки создают новый скоуп: переменная, объявлённая внутри if, не существует за его пределами.
Что делать дальше
Условия — входная точка в поток управления. Следующий шаг — циклы: в Go есть только for, но он покрывает и while, и foreach, и бесконечный цикл. После этого стоит разобраться с обработкой ошибок: конструкция if err != nil — самый частый паттерн в Go-коде, и понимание скоупов из этой инструкции пригодится напрямую. Официальный тур по языку — go.dev/tour — проведёт через оба этих раздела с интерактивными примерами в браузере.
Инфографика для маркетплейса: Три главных преимущества товара короткими фразами, выноски в безопасной зоне превью, точный размер площадки.
Спросить за 60 ₽Источники: The Go Programming Language Specification — If statements, Switch statements, A Tour of Go — Flow control
Частые вопросы
Можно ли использовать тернарный оператор в Go?
Почему if (x > 0) с круглыми скобками компилируется, но линтер ругается?
Можно ли писать if без else?
Что будет, если у меня более старая версия Go, например 1.18?
Почему switch в Go не требует break?
Код не компилируется, ошибка 'undefined' для переменной, объявлённой в if. Что делать?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.