Type switch — это специальная конструкция в Go, позволяющая выполнять различные ветки кода в зависимости от типа значения интерфейса. Это мощный инструмент для работы с интерфейсами и проверки типов во время выполнения (runtime type checking).
switch v := i.(type) {
case T1:
// v имеет тип T1
case T2:
// v имеет тип T2
default:
// тип не соответствует ни одному из case
}
Специальный синтаксис:
.(type)
только внутри switchv
автоматически получает правильный тип в каждой веткеОтличие от обычного type assertion:
val, ok := i.(T)
func describe(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Целое число: %v\n", v)
case string:
fmt.Printf("Строка: %q\n", v)
case bool:
fmt.Printf("Булево значение: %v\n", v)
default:
fmt.Printf("Неизвестный тип: %T\n", v)
}
}
type Animal interface { Sound() string }
type Dog struct{}
func (d Dog) Sound() string { return "Гав" }
type Cat struct{}
func (c Cat) Sound() string { return "Мяу" }
func MakeSound(a Animal) {
switch a.(type) {
case Dog:
fmt.Println("Собака говорит:", a.Sound())
case Cat:
fmt.Println("Кошка говорит:", a.Sound())
}
}
switch v := ptr.(type) {
case *int:
fmt.Println("Указатель на int:", *v)
case *string:
fmt.Println("Указатель на string:", *v)
}
Порядок проверки:
Default ветка:
Пустые интерфейсы:
interface{}
Когда применять:
Когда избегать:
Type switch — это идиоматический способ в Go для проверки и работы с разными типами, хранящимися в интерфейсе, предоставляющий чистый и безопасный синтаксис для ветвления по типам во время выполнения.