Перейти к основному содержимому
Модуль 2 · Урок 1 из 56/50 в курсе~10 min
Уроки модуля (1/5)

операторы if, else и init

В Go синтаксис if является классическим, но с двумя важными отличиями. по сравнению с C/Java: без круглых скобок вокруг условия и возможность объявлять временную переменную непосредственно в if (оператор init).

Основной синтаксис

Go
if temperatura > 30 {
    fmt.Println("caldo")
} else if temperatura > 20 {
    fmt.Println("mite")
} else {
    fmt.Println("fresco")
}

Крепкие скобки обязательны, даже для однострочных блоков. условие должно иметь тип bool: никакой «правдивости», как в Python или JS.

Go
n := 0
// if n { ... }   // ERRORE: int non è bool
if n != 0 { ... }  // ok

Оператор Init: область действия ограничена оператором if

Вы можете объявить переменную допустимой только внутри if/else, отделив его от условия с помощью ;:

Go
if v, err := call(); err == nil {
    fmt.Println("ok", v)
} else {
    fmt.Println("ko", err)
}
// qui v ed err NON esistono più

Это идиоматический шаблон обработки ошибок без загрязнения внешней области видимости.

Затенение в области if

Если внешняя переменная получает "затененную" при инициализации, внутри если локальная версия победит. Сразу после этого внешний снова появляется.

Go
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 строки — это выбор дизайна, обеспечивающий читабельность.

Go
var label string
if age >= 18 {
    label = "adulto"
} else {
    label = "minore"
}

Попробуйте это

Упражнение#go.m2.l1.e1
Попыток: 0Загрузка…

Выведите «положительное», «ноль» или «отрицательное» в зависимости от значения n.

Загрузка редактора…
Показать подсказку

`if/else if/else` цепочка с условиями по знаку.

Решение доступно после 3 попыток

Упражнение#go.m2.l1.e2
Попыток: 0Загрузка…

Используйте оператор init, чтобы объявить v := 42 в if и вывести его только в том случае, если v >= 18.

Загрузка редактора…
Показать подсказку

Синтаксис: `if init; условие { ... }`.

Решение доступно после 3 попыток

Quiz#go.m2.l1.e3
Готово

Что печатает эта программа?

Go
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.