Перейти к содержимому
Теория · Условия · урок 1 из 7

if и else

Чему вы научитесь

Чему вы научитесь:

  • выбирать, какой код выполнить, с помощью if, else if и else;
  • объявлять переменную прямо в if и понимать, где она видна;
  • заменять длинную цепочку else if инструкцией switch;
  • объяснять, чем switch в Go отличается от switch в C.
Развилка дороги с указателем: if налево, к остановке, и else направо, через парк

Представьте развилку дороги с указателем: «Если идёт дождь — налево, к остановке, иначе — направо, через парк». Вы читаете условие и выбираете одну дорогу, а по второй в этот раз не идёте. Программе тоже нужны такие развилки: напечатать одно или другое, посчитать так или иначе.

Инструкции в main выполняются по порядку, сверху вниз. Инструкция if выполняет блок в фигурных скобках, только если условие после if истинно. Блок после else выполняется, когда условие ложно:

GO
package main

import "fmt"

func main() {
    t := 25
    if t < 0 {
        fmt.Println("frost")
    } else if t < 20 {
        fmt.Println("cool")
    } else {
        fmt.Println("warm") // warm
    }
}

Давайте пройдём по программе:

  1. t := 25 — переменная t равна 25.
  2. if t < 0 — условие ложно, поэтому программа пропускает первую ветку.
  3. else if t < 20 — это условие тоже ложно.
  4. else — остаётся последняя ветка, и программа печатает warm.

Три вида веток

Каждый блок в фигурных скобках называют веткой. В примере их три, и у каждой своя роль.

if

Ветка if открывает развилку. Её заголовок состоит из трёх частей:

  • ключевое слово if;
  • условие, например t < 0;
  • блок в фигурных скобках, который выполняется, когда условие истинно.

Если условие ложно, программа пропускает блок и идёт дальше. if может стоять и один, без else: тогда при ложном условии не выполняется ничего.

else if

Ветка else if добавляет к развилке ещё одно условие. Она проверяется, только если все условия выше оказались ложны.

Цепочка else if проверяет условия сверху вниз и выполняет первую ветку, чьё условие истинно, а остальные пропускает. Поэтому порядок веток важен. Вторая ветка проверяется только при t >= 0, когда первое условие уже ложно, и приписка t >= 0 && в её условии не нужна.

Здесь развилка отличается от настоящей дороги: путник может выбрать самый подходящий указатель, а Go читает их строго сверху вниз и идёт по первому подходящему.

else

У ветки else нет условия. Она срабатывает, когда ложны все условия выше, и всегда стоит последней. Без неё в этом случае не выполнится ничего.

Фигурные скобки

Круглые скобки вокруг условия не нужны, хотя не мешают сборке. Фигурные скобки вокруг ветки обязательны, даже если в ней одна инструкция. Запись без них не компилируется:

GO
x := 5
if x > 0 fmt.Println("positive") // ✗
TEXT
syntax error: unexpected name fmt, expected {

Компилятор ждал { сразу после условия, а встретил имя fmt.

Ветки можно вкладывать друг в друга: внутри блока if стоит ещё один if со своими скобками. Скобки обязательны, поэтому сразу видно, к какому if относится каждый else.

Условие типа bool

Условие должно иметь тип bool. Подходят:

  • сравнения вроде x > 0;
  • их сочетания через &&, || и !;
  • переменная типа bool.

Go не превращает число в true или false, поэтому проверку на ноль пишут явно: x != 0. На if x { при x типа int компилятор отвечает ошибкой non-boolean condition in if statement.

Частая ошибка

else перенесли на новую строку после закрывающей скобки:

GO
x := 5
if x > 0 {
    fmt.Println("positive")
}
else { // ✗
    fmt.Println("not positive")
}
TEXT
syntax error: unexpected keyword else, expected }

Компилятор сам ставит точку с запятой в конце строки, которая заканчивается на }. Поэтому инструкция if завершается на этой скобке, и else на следующей строке оказывается сам по себе. Пишите } else { на одной строке. else if тоже ставьте на строку с закрывающей скобкой предыдущей ветки.

Главное

  • if выполняет ветку, когда условие истинно, а else — когда ложны все условия.
  • Цепочка else if выполняет первую ветку с истинным условием и пропускает остальные.
  • Условие имеет тип bool: число вместо условия не компилируется.
  • Фигурные скобки вокруг ветки обязательны, а } else { пишут на одной строке.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом