[TOC] # 类型查询 我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface).那么我们怎么反向知道这个变量里面实际保存了的是那个类型的对象呢?目前有两种方法: * comma-ok断言 * switch测试 # comma-ok断言 ![](https://box.kancloud.cn/a1fc55d148706452bf89ee0bf53a747c_1346x520.png) ~~~ data := "string" v, ok := interface{}(data).(string) fmt.Println(v, ok) ~~~ ~~~ func main() { //切片 i := make([]interface{}, 3) i[0] = 1 i[1] = "hello" i[2] = Student{"111", 22} //类型查询,类型断言 //第一个返回下标,第二个返回下标对应的值 //data分别对应i[0], i[1], i[1] for index, data := range i { //第一个返回值,第二个返回判断结果的真假 //是不是int类型 if value, ok := data.(int); ok == true { fmt.Println("类型是int,索引和内容是: ", index, value) } else if value, ok := data.(string); ok == true { fmt.Println("类型是string,索引和内容是: ", index, value) } } } ~~~ # switch ~~~ func main() { //切片 i := make([]interface{}, 3) i[0] = 1 i[1] = "hello" i[2] = Student{"111", 22} //类型查询,类型断言 //第一个返回下标,第二个返回下标对应的值 //data分别对应i[0], i[1], i[1] for index, data := range i { switch value := data.(type) { case int: fmt.Println(index, value) case string: fmt.Println(index, value) } } } ~~~