Go语言类型断言的用法(附带实例)
类型断言即判断接口的数据类型。在 Go 语言中,类型断言的语法格式如下。
返回值说明如下:
如果 T 是某个具体的数据类型且 x 的数据类型是 T 类型,那么类型断言返回的结果是 x 的值和 true。
如果 T 是接口类型,且 x 的数据类型是 T 类型,则类型断言返回的结果是 T 类型的接口值和 true。
那么,在实际开发过程中,如何使用类型断言呢?
【实例 1】类型断言的第一种使用方法。检查接口变量的数据类型是否是 int 类型。声明两个接口变量 a 和 b,它们的值分别为 711 和“实践出真知”。使用类型断言的语法格式分别检查 a 和 b 的数据类型是否是 int 类型,并打印检查后的结果。代码如下:
注意:
【实例 2】类型断言的第二种使用方法。检查接口变量的数据类型是否是 person 类型。为奔跑的生物声明接口 runner,其中包含奔跑函数 run()。分别定义表示人和猫的结构体,这两个结构体都包含表示腿的数量的 int 类型字段 legs,并且都能实现接口 runner。在 main() 函数中,声明接口变量 r,分别使用键值对初始化这两个结构体,分别对初始化的两个结构体执行“取地址”操作,把操作后的结果先后赋值给接口变量 r,并检查 r 的数据类型是否是 person 类型,打印检查结果。代码如下:
value, ok := x.(T)参数说明如下:
- x:接口变量;
- T:接口的数据类型。
返回值说明如下:
- 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
注意:
- 在类型断言的语法格式中,两个返回值缺一不可,否则引发 panic。
- 在类型断言的语法格式中,x的值不能为nil,否则引发panic。
【实例 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