首页 > 编程笔记 > Go语言笔记 阅读:10

Go语言类型断言的用法(附带实例)

类型断言即判断接口的数据类型。在 Go 语言中,类型断言的语法格式如下。
value, ok := x.(T)
参数说明如下:
返回值说明如下:
如果 T 是某个具体的数据类型且 x 的数据类型是 T 类型,那么类型断言返回的结果是 x 的值和 true。

如果 T 是接口类型,且 x 的数据类型是 T 类型,则类型断言返回的结果是 T 类型的接口值和 true。

那么,在实际开发过程中,如何使用类型断言呢?

【实例 1】类型断言的第一种使用方法。检查接口变量的数据类型是否是 int 类型。声明两个接口变量 a 和 b,它们的值分别为 711 和“实践出真知”。使用类型断言的语法格式分别检查 a 和 b 的数据类型是否是 int 类型,并打印检查后的结果。代码如下:
package main //声明 main 包

import "fmt" //导入 fmt 包,用于打印字符串

func main() { //声明 main()函数
    var a, b interface{} //声明两个接口变量
    a = 711 //a 的值为 711
    b = "实践出真知" //b 的值为 “实践出真知”
    value_a, ok_a := a.(int) //检查 a 的数据类型是否是 int 类型
    fmt.Printf("a 的值为%v,数据类型是 int 类型:%v\n", value_a, ok_a) //检查 a 的数据类型是否是 int 类型
    value_b, ok_b := b.(int) //检查 b 的数据类型是否是 int 类型
    fmt.Printf("b 的值为%v,数据类型是 int 类型:%v\n", value_b, ok_b)
}
运行结果如下:

a的值为711,数据类型是int类型:true
b的值为0,数据类型是int类型:false


注意:
【实例 2】类型断言的第二种使用方法。检查接口变量的数据类型是否是 person 类型。为奔跑的生物声明接口 runner,其中包含奔跑函数 run()。分别定义表示人和猫的结构体,这两个结构体都包含表示腿的数量的 int 类型字段 legs,并且都能实现接口 runner。在 main() 函数中,声明接口变量 r,分别使用键值对初始化这两个结构体,分别对初始化的两个结构体执行“取地址”操作,把操作后的结果先后赋值给接口变量 r,并检查 r 的数据类型是否是 person 类型,打印检查结果。代码如下:
package main //声明 main 包

import "fmt" //导入 fmt 包,用于打印字符串

type runner interface { //为奔跑的生物声明接口
    run() //奔跑函数
}

type person struct { //表示人的结构体
    legs int //腿的数量
}

type cat struct { //表示猫的结构体
    legs int //腿的数量
}

func (p *person) run() { //表示人的结构体实现接口中的 run()函数
    fmt.Printf("人类用%v 条腿奔跑\n", p.legs)
}

func (c *cat) run() { //表示猫的结构体实现接口中的 run()函数
    fmt.Printf("猫用%v 条腿奔跑\n", c.legs)
}

func main() { //声明 main()函数
    var r runner //声明一个接口变量
    //键值对初始化结构体
    pn := person{legs: 2}
    ct := cat{legs: 4}
    r = &pn //对 pn 执行 “取地址” 操作
    value_pn, ok_pn := r.(*person) //检查 r 的数据类型是否是 person 类型
    fmt.Printf("r 的值为%v,数据类型是 person 类型:%v\n", value_pn, ok_pn)
    r = &ct //对 ct 执行 “取地址” 操作
    value_ct, ok_ct := r.(*person) //检查 r 的数据类型是否是 person 类型
    fmt.Printf("r 的值为%v,数据类型是 person 类型:%v\n", value_ct, ok_ct)
}
运行结果如下:

r的值为&{2},数据类型是person类型:true
r的值为<nil>,数据类型是person类型:false

相关文章