Переключатель типов в Go
Переключатель может разобрать значение интерфейса
по конкретным типам. В заголовке пишут имя
переменной и выражение утверждения с ключевым
словом type. В каждой ветке case
указывают тип, с которым сравнивают содержимое.
Напишем функцию, которая печатает строку, число или сообщение для остальных типов:
package main
import "fmt"
func show(x any) {
switch v := x.(type) {
case string:
fmt.Println("str", v)
case int:
fmt.Println("int", v)
default:
fmt.Println("other")
}
}
func main() {
show("hi")
show(10)
show(true)
}
Первый вызов попал в ветку string,
второй в int, третий в default.
Переменная v в каждой ветке имеет
уже конкретный тип, под который попали.
После выполнения одной ветки управление
не переходит в следующую: каждая ветка
заканчивается отдельно.
Ветку default ставят, когда нужно
обработать все остальные типы. Без нее
неизвестный тип просто не попадет ни в
один case, и блок ничего не сделает.
Дана функция:
package main
import "fmt"
func kind(x any) {
switch x.(type) {
case bool:
fmt.Println("bool")
case float64:
fmt.Println("float")
default:
fmt.Println("unknown")
}
}
Вызовите kind с true и
с 1.5.
Перепишите show из урока так,
чтобы в ветке string выводился
только текст без префикса.
Скажите, выполнятся ли две ветки case
подряд для одного значения без отдельной
команды перехода.