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

Go语言type switch类型分支的用法(附带实例)

如果接口类型是多种可能的类型之一,那么为了确定这个接口的类型就需要一长串的,实现类型断言功能的 if-else 语句。

在 Go 语言中,是否有其他方法能简化这一长串的 if-else 语句呢?为此,Go 语言提供了类型分支(type-switch)。

类型分支(type-switch)的语法格式如下:
switch 接口变量.(type){
case 类型1:
    //当变量类型是类型1时执行的代码
case 类型2:
    //当变量类型是类型2时执行的代码
default:
    //当变量类型不是所有 case 中列举的类型时执行的代码
}
参数说明如下:
【实例 1】声明判断类型的 judgeType() 函数,其参数是空接口类型的变量。在这个函数中,使用 type-switch 分别判断变量的类型是否是 int、bool 或 string 类型,并打印判断结果。在 main() 函数中,分别调用 judgeType() 函数,并把参数的值设置为 7、false 和“真理是检验实践的唯一标准”。代码如下:
package main //声明 main 包

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

func judgeType(v interface{}){
    //声明用于判断类型的函数,其参数是空接口类型的变量
    switch v.(type) {
    case int: //如果变量的类型是 int 类型
        fmt.Printf("%v 的数据类型是 int 类型。\n", v) //则打印变量的类型是 int 类型
    case bool: //如果变量的类型是 bool 类型
        fmt.Printf("%v 的数据类型是 bool 类型。\n", v) //则打印变量的类型是 bool 类型
    case string: //如果变量的类型是 string 类型
        fmt.Printf("%v 的数据类型是 string 类型。\n", v) //则打印变量的类型是 string 类型
    }
}

func main() {
    judgeType(false) //调用 judgeType()函数,把参数的值设置为 bool 类型的 7
    judgeType("真理是检验实践的唯一标准") //调用 judgeType 函数,把参数的值设置为 string 类型
}
运行结果为:

false 的数据类型是 bool 类型。
真理是检验实践的唯一标准 的数据类型是 string 类型。


类型分支不仅可以判断基础类型,还可以判断接口类型。

【实例 2】判断接口变量的数据类型是 person 类型,还是 cat 类型。代码如下:
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() {
    var r runner //声明 main()函数
    //键值对初始化结构体
    pn := person{legs: 2}
    ct := cat{legs: 4}
    r = &pn //对 pn 执行 “取地址” 操作
    switch r.(type) {
    case *person: //如果 r 的数据类型是 person 类型
        fmt.Printf("r 的值为%v,数据类型是 person 类型。\n", r)
    case *cat: //如果 r 的数据类型是 cat 类型
        fmt.Printf("r 的值为%v,数据类型是 cat 类型。\n", r)
    default: //如果 r 的数据类型既不是 person 类型,也不是 cat 类型
        fmt.Printf("r 的值为%v,它什么类型都不是!\n", r)
    }
}
运行结果为:

r的值为&{4},数据类型是cat类型。

相关文章