1、switch 可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
x.(type)相当于变量x的Type类型,即:reflect.TypeOf(x).Name()
注意区别x的Kind类型;
type BaseController struct {
}
func main() {
var x interface{}
x = BaseController{}
switch i := x.(type) {
case nil:
fmt.Printf(" x 的类型 :%T",i)
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
case func(int) float64:
fmt.Printf("x 是 func(int) 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型" )
case struct{}:
fmt.Printf("x 是 struct{}" )
case BaseController:
fmt.Printf("x 是 BaseController" )
default:
fmt.Printf("未知型")
}
}
打印输出:
fmt.Println(fmt.Sprintf("\nx 的Type类型:%v", reflect.TypeOf(x).Name()))
// 打印: x 的Type类型:BaseController
fmt.Println(fmt.Sprintf("\nx 的Kind类型:%v", reflect.TypeOf(x).Kind()))
// 打印: x 的Kind类型:struct
2、看结构体指针类型
type BaseController struct {
}
func main() {
var x interface{}
x = &BaseController{}
switch i := x.(type) {
case nil:
fmt.Printf(" x 的类型 :%T",i)
case int:
fmt.Printf("x 是 int 型")
case bool, string:
fmt.Printf("x 是 bool 或 string 型" )
case struct{}:
fmt.Printf("x 是 struct{}" )
case *BaseController:
fmt.Printf("x 是 *BaseController" )
default:
fmt.Printf("未知型")
}
// 打印: x 是 *BaseController
fmt.Println(fmt.Sprintf("\nx 的Type类型:%v", reflect.TypeOf(x).Name())) // 空值
// 打印: x 的Type类型:
fmt.Println(fmt.Sprintf("\nx 的Kind类型:%v", reflect.TypeOf(x).Kind()))
// 打印: x 的Kind类型:ptr
}