Конструкция type switch
Конструкция type switch в Go используется для проверки типа значения, хранящегося в интерфейсе. Она похожа на обычный switch, но в качестве выражения используется утверждение типа. В каждом случае (case) указывается конкретный тип, и выполняется соответствующий блок кода, если значение интерфейса имеет этот тип. Переменная, которая хранит значение интерфейса, может быть повторно использована внутри каждого блока case с уже конкретным типом.
Синтаксис
switch v := x.(type) {
case int:
// v имеет тип int
case string:
// v имеет тип string
default:
// v имеет тип интерфейса
}
В данном примере x — это переменная интерфейсного типа. Выражение x.(type) используется внутри switch для проверки типа. Переменная v принимает значение x, но с конкретным типом, указанным в каждом case.
Пример
Давайте проверим тип значения, хранящегося в интерфейсе, и выведем соответствующее сообщение:
package main
import "fmt"
func main() {
var x interface{} = 42
switch v := x.(type) {
case int:
fmt.Printf("x is int: %d", v)
case string:
fmt.Printf("x is string: %s", v)
default:
fmt.Println("x is unknown type")
}
}
Результат выполнения кода:
"x is int: 42"
Пример
Теперь проверим интерфейс, содержащий значение типа string:
package main
import "fmt"
func main() {
var x interface{} = "hello"
switch v := x.(type) {
case int:
fmt.Printf("x is int: %d", v)
case string:
fmt.Printf("x is string: %s", v)
default:
fmt.Println("x is unknown type")
}
}
Результат выполнения кода:
"x is string: hello"
Пример
Рассмотрим пример с несколькими типами, включая пользовательский тип и интерфейс:
package main
import "fmt"
type MyInt int
func main() {
var x interface{} = MyInt(100)
switch v := x.(type) {
case int:
fmt.Println("x is int")
case MyInt:
fmt.Println("x is MyInt")
case interface{}:
fmt.Println("x is some interface")
default:
fmt.Println("x is unknown type")
}
}
Результат выполнения кода:
"x is MyInt"
Смотрите также
-
конструкцию
type assertion,
которая проверяет, реализует ли интерфейс конкретный тип -
понятие
пустого интерфейса,
который может хранить значение любого типа -
конструкцию
comma-ok,
которая безопасно проверяет тип интерфейса -
интерфейс
fmt.Stringer,
который используется для строкового представления типов