Перейти до основного вмісту
Модуль 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) для розрізнення на основі динамічного типу (модуль інтерфейсів).