Модульні уроки (4/5)
Ідіоматичний перемикач
switch Go більш ергономічний, ніж C/Java: кожен case має свій
власний неявний блок (без break для запису), ви можете згрупувати
кілька значень із комою та switch без виразу
як більш читабельний ланцюжок if/else if.
Увімкніть значення
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:
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 також приймає оператор ініціалізації:
switch n := len(s); {
case n == 0:
fmt.Println("vuoto")
case n > 100:
fmt.Println("lungo")
default:
fmt.Println("ok")
}n існує лише всередині комутатора.
Відвертий fallthrough
Якщо ви дійсно хочете, щоб виконання потрапило в наступний випадок, ви повинні написати це:
switch 1 {
case 1:
fmt.Println("uno")
fallthrough
case 2:
fmt.Println("due") // anche questo viene stampato
case 3:
fmt.Println("tre") // questo no
}Перемикач типу (попередній перегляд)
Це дозволяє розрізняти на основі динамічного типу інтерфейсу значення. Ми детально розглянемо це в модулі інтерфейсів:
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)
}Спробуйте
Надрукуйте «feriale» для lun/mar/mer/gio/ven, «weekend» інакше, використовуючи перемикач на значенні g.
Показати підказку
Згрупуйте 5 днів тижня в один регістр, розділений комами.
Рішення доступне після 3 спроб
Використовуйте перемикач БЕЗ умов, щоб надрукувати «нег», «нуль» або «поз» залежно від x.
Показати підказку
Жодного виразу після `switch`, лише `{`.
Рішення доступне після 3 спроб
Що друкує ця програма?
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)для розрізнення на основі динамічного типу (модуль інтерфейсів).