开发者学堂课程【Go语言核心编程 - 基础语法、数组、切片、Map:switch使用细节(2)】与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/625/detail/9571
switch使用细节(2)
内容介绍:
一、switch细节讨论
一、switch细节讨论
1、特性七
switch 后也可以不代表达式,类似多个 if-else 分支来使用。
案例:
定义变量age类型为int,赋值为10,满足 case 语句则进行输出。
代码为:
var age int = 10
switch {
case age == 10:
fmt.Println(
“
age == 10
”
)
case age == 20:
fmt.Println(
“
age == 20
”
)
default:
fmt.Println(
“
没有匹配到
”
)
}
运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go
age == 10
甚至 case 中也可以对范围进行判断,当成范围来使用。如下定义一个成绩为30分,判断如果 score 大于90则输出成绩优秀,如果 score>=70并且 score<=90则输出成绩优良,如果 score>=60并且 score<=70则输出成绩合格,否则输出不及格。后面也可以写更多的 case 语句。这里 score 为30分,所以输出应该为不及格,下面运行程序进行验证。
代码为:
var score int = 30
switch {
case score > 90:
fmt.Println(
“
成绩优秀..
”
)
case score >= 70 && score <= 90:
fmt.Println(
“
成绩优良...
”
)
case score >=60 && score <= 70:
fmt.Println(
“
成绩及格...
”
)
default:
fmt.Println(
“
不及格
”
)
}
D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go
age == 10
不及格
验证正确,如果将 score 改为90分,则应输出成绩优良,运行如下:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go
age == 10
成绩优良…
与上面的分析符合,这里要注意switch的这种用法在Golang中可以这么使用,但在其他传统编程语言中是不可以这么使用的。
2、特性八
switch 后也可以直接声明/定义一个变量,分号结束,不推荐。
案例:
如下在 switch 后定义变量 grade :=90,为了区别之前的代码在 Print 中加上~。
代码如下:
switch grade
:
=90;
{ //在golang中,可以这样写
case grade > 90:
fmt.Println(
“
成绩及格~..
”
)
case grade >= 70 && score <= 90:
fmt.Println(
“
成绩优良~...
”
)
case grade >=60 && score <= 70:
fmt.Println(
“
成绩及格~...
”
)
default:
fmt.Println(
“
不及格~
”
)
}
运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go
age == 10
成绩优良…
成绩优良~…
3、特性九
switch 穿透-fallthrough,如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也叫 switch 穿透。
案例:
定义变量 num 类型为 int,赋值为10,使用 num 进行匹配,如果 num=10就输出ok1,如果 num=20就输出ok2,如果 num=30就输出ok3,否则没有匹配成功。如果根据传统的方式进行执行的话,num匹配到case 10就不会再继续执行,输出ok1后代码就执行完退出程序。而如果在ok1后加上 fallthrough 语句,则会不判断case 20,直接输出ok2,不输出后面的ok3,因为默认只能穿透一层,要是想20也执行穿透就把10和20放在一起,如case10,20:,下面运行进行查看结果。
代码为:
var num int = 10
switch num{
case num == 10:
fmt.Println(
“
ok1
”
)
fallthrough //默认只能穿透一层
case num == 20:
fmt.Println(
“
ok2
”
)
case num == 30:
fmt.Println(
“
ok3
”
)
default:
fmt.Println(
“
没有匹配到
”
)
}
运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go
age == 10
成绩优良…
成绩优良~…
ok1
ok2
如果在ok2后也加上 fallthrough 则ok3也会输出,代码为:
…
case num == 20:
fmt.Println(
“
ok2
”
)
fallthrough
…
运行结果:D:\goproject\src\go_code\chapter05\switchdemo\demo01>go run main.go
age == 10
成绩优良…
成绩优良~…
ok1
ok2
ok3
4、特性十
Type Switch:switch 语句还可以被用于 type-switch来判断某个 interface 变量中实际指向的变量类型【还没有学 interface,先体验一下】注意:interface 是接口
案例:如下代码 interface 是一个空接口,y赋值为10.0,再将 float 变量y赋值给x,接下来x.(type)就是 type 的使用,会把x指向的真正数据类型求出来,也就是说x本身是 interface,但因为把y赋值给x了,所以x真正的数据类型是 float64,于是i就会得到x真正指向的数据类型,i就是 float64类型,然后进行 case 判断,类型为空null,则输出x的类型为~,判断类型为 int,则输出x的类型为 int,以此类推。甚至可以判断是不是函数,接口也可以接收函数,只是这里暂时不讲。总结起来就是x.(type)运算结合 Switch 可以去判断空接口实际指向的数据类型。
代码为:
var x interface{
}
var y = 10.0
x= y
switch i := x.(type){
case null:
fmt.Println(
“
x 的类型是~ :%T
”
,i)
case int:
fmt.Println(
“
x是int型
”
)
case float64:
fmt.Println(
“
x是float64型
”
,i)
case func(int) float64:
fmt.Println(
“
x是func(int)型
”
,i)
case bool,string:
fmt.Println(
“
x是bool型或string型
”
,i)
default:
fmt.Println(
“
未知型
”
)
}
代码输出结果是 float64,因为y类型为 float64,当然y类型为 int 或者 int32等,都是可以进行判断的。这里就不再进行演示,等到讲解接口的时候会详细的说明。到此 switch 分支结构的细节讨论就讲解完全了,后面将进行 switch 的课堂练习加深 switch 分支的理解。