Уроки модуля (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)для дискриминации на основе динамического типа (модуль «Интерфейсы»).