首页 > 编程笔记

Go语言类型断言用法详解

类型断言是判断接口的数据类型,它的语法如下:
x.(T)
语法说明如下:
由于空接口可以设置任意的数据类型,若开发中需要根据空接口的数据类型执行不同的业务处理,比如定义函数 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)
}
分析上述代码,说明如下:
程序运行的结果为:

返回值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(),代码的逻辑说明如下:
代码运行结果为:

执行相机连接
连接相机:索尼
执行手机连接
连接手机:华为

推荐阅读

副业交流群 关注微信公众号,加入副业交流群,学习变现经验,交流各种打法。