Go语言type switch类型分支的用法(附带实例)
如果接口类型是多种可能的类型之一,那么为了确定这个接口的类型就需要一长串的,实现类型断言功能的 if-else 语句。
在 Go 语言中,是否有其他方法能简化这一长串的 if-else 语句呢?为此,Go 语言提供了类型分支(type-switch)。
类型分支(type-switch)的语法格式如下:
【实例 1】声明判断类型的 judgeType() 函数,其参数是空接口类型的变量。在这个函数中,使用 type-switch 分别判断变量的类型是否是 int、bool 或 string 类型,并打印判断结果。在 main() 函数中,分别调用 judgeType() 函数,并把参数的值设置为 7、false 和“真理是检验实践的唯一标准”。代码如下:
类型分支不仅可以判断基础类型,还可以判断接口类型。
【实例 2】判断接口变量的数据类型是 person 类型,还是 cat 类型。代码如下:
在 Go 语言中,是否有其他方法能简化这一长串的 if-else 语句呢?为此,Go 语言提供了类型分支(type-switch)。
类型分支(type-switch)的语法格式如下:
switch 接口变量.(type){ case 类型1: //当变量类型是类型1时执行的代码 case 类型2: //当变量类型是类型2时执行的代码 default: //当变量类型不是所有 case 中列举的类型时执行的代码 }参数说明如下:
- type: 接口的数据类型;
- type-switch 与 switch 语句类似,二者之间的区别在于 switch 语句中比较的是操作数,而 type-switch 中比较的是“接口变量.(type)”。
【实例 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类型。