GO-类型断言

目录

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

  • comma-ok断言
  • switch测试

1.comma-ok断言

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

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

var i []interface{}

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

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()
    }
}

2. 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)
    }
}

类型断言

if判断

package main

import "fmt"

type Student struct {
        name string
        id   int
}

func main() {
        i := make([]interface{}, 3)
        i[0] = 1                    //int
        i[1] = "hello go"           //string
        i[2] = Student{"mike", 666} //Student

        //类型查询,类型断言
        //第一个返回下标,第二个返回下标对应的值, data分别是i[0], i[1], i[2]
        for index, data := range i {
                //第一个返回的是值,第二个返回判断结果的真假
                if value, ok := data.(int); ok == true {
                        fmt.Printf("x[%d] 类型为int, 内容为%d\n", index, value)
                } else if value, ok := data.(string); ok == true {
                        fmt.Printf("x[%d] 类型为string, 内容为%s\n", index, value)
                } else if value, ok := data.(Student); ok == true {
                        fmt.Printf("x[%d] 类型为Student, 内容为name = %s, id = %d\n", index, value.name, value.id)
                }
        }

}

Switch判断

package main

import "fmt"

type Student struct {
        name string
        id   int
}

func main() {
        i := make([]interface{}, 3)
        i[0] = 1                    //int
        i[1] = "hello go"           //string
        i[2] = Student{"mike", 666} //Student

        //类型查询,类型断言
        for index, data := range i {
                switch value := data.(type) {
                case int:
                        fmt.Printf("x[%d] 类型为int, 内容为%d\n", index, value)
                case string:
                        fmt.Printf("x[%d] 类型为string, 内容为%s\n", index, value)
                case Student:
                        fmt.Printf("x[%d] 类型为Student, 内容为name = %s, id = %d\n", index, value.name, value.id)
                }

        }
}