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

Идиоматический переключатель

switch в Go более эргономичен, чем в C/Java: каждый case имеет свои собственный неявный блок (нет break для записи), вы можете группировать несколько значений через запятую и поведение switch без выражения как более читаемая цепочка if/else if.

Включить значение

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

case принимает несколько значений, разделенных запятыми, и неявное значение отсутствует. Fallthrough: как только кейс выполнен, коммутатор завершает работу.

Переключение без условия

Если вы опустите выражение, переключатель вычислит true, и каждый case будет bool состояние. Это идиоматическая альтернатива длинным цепочкам if/else if:

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

Оператор инициализации

Как и if, switch также принимает оператор инициализации:

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n существует только внутри коммутатора.

Явное fallthrough

Если вы действительно хотите, чтобы выполнение попало в следующий случай, вам придется написать его:

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

Переключатель типа (предварительный просмотр)

Он позволяет различать динамический тип интерфейса. ценность. Мы подробно рассмотрим это в модуле «Интерфейсы»:

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

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

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

Выведите «feriale» для lun/mar/mer/gio/ven, в противном случае — «weekend», используя переключатель значения g.

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

Сгруппируйте 5 дней недели в один регистр, разделив их запятыми.

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

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

Используйте переключатель БЕЗ условия для печати «отрицательного», «нуля» или «позиции» в зависимости от x.

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

Никакого выражения после `switch`, просто `{`.

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

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

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

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
Варианты ответа

Резюме

  • case принимает несколько значений, разделенных запятыми.
  • Нет неявных ошибок: каждый случай имеет свой собственный неявный break. — switch { ... } без выражения = более читаемая цепочка if/else if. — Оператор инициализации: switch x := f(); { ... }, область действия ограничена блоком.
  • fallthrough существует, но встречается редко; переходит к следующему случаю БЕЗ оценки его состояния.
  • Введите переключатель v := i.(type) для дискриминации на основе динамического типа (модуль «Интерфейсы»).