Уроки модуля (1/5)
операторы if, else и init
В Go синтаксис if является классическим, но с двумя важными отличиями.
по сравнению с C/Java: без круглых скобок вокруг условия и
возможность объявлять временную переменную непосредственно в if
(оператор init).
Основной синтаксис
if temperatura > 30 {
fmt.Println("caldo")
} else if temperatura > 20 {
fmt.Println("mite")
} else {
fmt.Println("fresco")
}Крепкие скобки обязательны, даже для однострочных блоков.
условие должно иметь тип bool: никакой «правдивости», как в Python или JS.
n := 0
// if n { ... } // ERRORE: int non è bool
if n != 0 { ... } // okОператор Init: область действия ограничена оператором if
Вы можете объявить переменную допустимой только внутри if/else,
отделив его от условия с помощью ;:
if v, err := call(); err == nil {
fmt.Println("ok", v)
} else {
fmt.Println("ko", err)
}
// qui v ed err NON esistono piùЭто идиоматический шаблон обработки ошибок без загрязнения внешней области видимости.
Затенение в области if
Если внешняя переменная получает "затененную" при инициализации, внутри если локальная версия победит. Сразу после этого внешний снова появляется.
x := 10
if x := 3; x > 5 {
fmt.Println("dentro:", x) // mai stampato (3 < 5)
} else {
fmt.Println("else:", x) // 3
}
fmt.Println("dopo:", x) // 10 — quella esternaНет тернарного оператора
В Go нет cond ? a : b. Для условных присвоений вам понадобится if/else.
в 3-4 строки — это выбор дизайна, обеспечивающий читабельность.
var label string
if age >= 18 {
label = "adulto"
} else {
label = "minore"
}Попробуйте это
Выведите «положительное», «ноль» или «отрицательное» в зависимости от значения n.
Показать подсказку
`if/else if/else` цепочка с условиями по знаку.
Решение доступно после 3 попыток
Используйте оператор init, чтобы объявить v := 42 в if и вывести его только в том случае, если v >= 18.
Показать подсказку
Синтаксис: `if init; условие { ... }`.
Решение доступно после 3 попыток
Что печатает эта программа?
x := 10
if x := 3; x > 5 {
fmt.Println("dentro:", x)
} else {
fmt.Println("else:", x)
}
fmt.Println("dopo:", x)Резюме
- Условия без скобок, фигурные скобки всегда обязательны.
- Условие должно быть
bool: нет неявной истинности. - Инициализация
if v, err := f(); err == nil { ... }ограничивает область действияvиerr. - Затенение в инициализации: будьте осторожны, чтобы не затенить внешние переменные.
- Нет троичного типа: напишите расширенный
if/else.