Go语言类型断言用法详解
类型断言是判断接口的数据类型,它的语法如下:
由于空接口可以设置任意的数据类型,若开发中需要根据空接口的数据类型执行不同的业务处理,比如定义函数 get_data(),函数参数和返回值皆为空接口,则函数需要根据参数的数据类型进行不同的业务处理,代码示例如下:
程序运行的结果为:
类型断言除了判断空接口的数据类型之外,还可以结合接口和结构体使用,通过判断接口与结构体之间的绑定关系进行不同的业务处理,示例如下:
代码运行结果为:
x.(T)语法说明如下:
- x:表示类型为 interface{} 的变量;
- T:表示断言x可能的数据类型。
由于空接口可以设置任意的数据类型,若开发中需要根据空接口的数据类型执行不同的业务处理,比如定义函数 get_data(),函数参数和返回值皆为空接口,则函数需要根据参数的数据类型进行不同的业务处理,代码示例如下:
package main import ( "fmt" ) func get_data(d interface{}) interface{} { if a, ok := d.(string); ok { fmt.Printf("返回值ok为:%v,数据类型%T\n", ok) fmt.Printf("返回值a为:%v,数据类型:%T\n", a, a) fmt.Printf("参数值为:%v,数据类型:%T\n", d, d) return d } else if _, ok := d.(int); ok { fmt.Printf("参数值为:%v,数据类型:%T\n", d, d) return d } return "什么类型都不是" } func main() { d := get_data("Tom") fmt.Printf("返回值为:%v,数据类型:%T\n", d, d) d1 := get_data(666) fmt.Printf("返回值为:%v,数据类型:%T\n", d1, d1) d2 := get_data(true) fmt.Printf("返回值为:%v,数据类型:%T\n", d2, d2) }分析上述代码,说明如下:
- 函数 get_data() 的参数和返回值皆为空接口,函数使用 if 判断参数的数据类型,判断方式使用类型断言 x.(T)。
- 类型断言 x.(T) 有两个返回值,第一个返回值是空接口的数值和数据类型,第二个返回值是布尔型,判断 x 是不是 T 的数据类型。
- 主函数 main() 执行了 3 次函数调用,第一次调用传入字符串类型的参数,第二次调用传入整型类型的参数,第三次调用传入布尔型的参数。
程序运行的结果为:
返回值ok为:true,数据类型%!T(MISSING)
返回值a为:Tom,数据类型:string
参数值为:Tom,数据类型:string
返回值为:Tom,数据类型:string
参数值为:666,数据类型:int
返回值为:666,数据类型:int
返回值为:什么类型都不是,数据类型:string
类型断言除了判断空接口的数据类型之外,还可以结合接口和结构体使用,通过判断接口与结构体之间的绑定关系进行不同的业务处理,示例如下:
package main import ( "fmt" ) // 定义接口 type usb interface { connect() } // 定义结构体 type phone struct { name string } type camera struct { name string } // 定义结构体方法 func (p *phone) connect() { fmt.Printf("连接手机:%v\n", p.name) } func (c *camera) connect() { fmt.Printf("连接相机:%v\n", c.name) } func main() { var u usb p := phone{name: "华为"} c := camera{name: "索尼"} // 第一次使用类型断言 u = &c if _, ok := u.(*camera); ok { fmt.Printf("执行相机连接\n") u.connect() } // 第二次使用类型断言 u = &p if _, ok := u.(*phone); ok { fmt.Printf("执行手机连接\n") u.connect() } }上述示例定义了接口 usb、结构体 phone、camera 和结构体方法 connect(),代码的逻辑说明如下:
- 接口 usb 定义了方法 connect();结构体 phone、camera 分别设置了结构体成员 name 和定义了结构体方法 connect(),结构体方法使用指针接收者的方式定义。
- 主函数 main() 分别定义了接口变量 u 和实例化结构体 phone、camera,并且执行了两次类型断言。
- 第一次类型断言将接口变量 u 绑定结构体 camera,由于结构体方法 connect() 使用了指针接收者,因此类型断言的T也要使用指针类型,如 u.(*camera);第二次类型断言将接口变量 u 绑定结构体 phone,类型断言的 T 也使用指针类型。
代码运行结果为:
执行相机连接
连接相机:索尼
执行手机连接
连接手机:华为