我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface)。那么我们怎么反向知道这个变量里面实际保存了的是哪个类型的对象呢?目前常用的有两种方法:

  • comma-ok断言
  • switch测试

一、comma-ok断言

Go语言里面有一个语法,可以直接判断是否是该类型的变量:value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。

如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

func main() {
	// 空接口类型的切片
	var i interface{}
	i = 10.1
	value, ok := i.(int)
	if ok {
		fmt.Println("整型数据", value)
	} else {
		fmt.Println("非整型数据", value)
	}
}

非整型数据 0
func main() {
	var i []interface{}

	i = append(i, 10, 3.14, "aaa")

	for _, v := range i {
		if data, ok := v.(int); ok {
			fmt.Println("整型数据:", data)
		} else if data, ok := v.(float64); ok {
			fmt.Println("浮点型数据:", data)
		} else if data, ok := v.(string); ok {
			fmt.Println("字符串数据:", data)
		} else if data, ok := v.(func()); ok {
			//函数调用
			data()
		}
	}

}

如果这个i中有v.(int)也就是int类型的数值就返回打印出来。

二、switch测试

var i []interface{}

i = append(i, 10, 3.14, "aaa", demo15)

for _,data := range i{
    switch value:=data.(type) {
    case int:
        fmt.Println("整型",value)
    case float64:
        fmt.Println("浮点型",value)
    case string:
        fmt.Println("字符串",value)
    case func():
        fmt.Println("函数",value)
    }
}

这个也是一样的道理只不过是用了另外一种方法,data也就是里面的值,如果里面的值类型是int的话就打印出来这个值。

09-14 23:05