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
}