1).switch语句用于基于不同条件执行不同动作,每一个case分支都是唯一的, 从上到下逐一测试,直到匹配为止
2).匹配项后面也不需要再加break
基本语法
switch 表达式 {
case 表达式1,表达式2...:
语句块1
case 表达式3,表达式4...:
语句块2
//这里可以有多个case语句
...
default:
语句块
}
对上图的说明:
1).switch的执行流程是:先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就执行对应case的语句块,然后退出switch
2).如果switch的表达式的值没有和任何的case的表达式相匹配,则执行default中的语句块,执行后退出switch
3).go的case后的表达式可以有多个,用逗号间隔
4).go中的case语句块不需要写break,因为默认会有,即使在默认情况下,当程序执行完case语句块后,就直接退出该switch控制结构
//快速入门
//编写一个程序:可以接收一个字符,eg:1,b,c,d..,a表示周一,b表示周二,..根据用户的输入显示相应的信息
//思路分析:
//1.定义一个变量byte接收输入的字符
//2.使用switch完成
var key byte
fmt.Println("请输入一个字符,eg:a,b,c,d..")
fmt.Scanf("%c", &key)
switch key {
case "a":
fmt.Println("周一吃面")
case "b":
fmt.Println("周二吃螺蛳粉")
case "c":
fmt.Println("周三吃火锅")
...
default:
fmt.Println("错误")
}
switch细节讨论
1).case后是一个表达式(即:常量值,变量,一个有返回值的函数等都可以)
switch test(key) + 1 { case "a": fmt.Println("周一吃面") ... default: fmt.Println("错误") }
2).case后的各个表达式的值的数据类型,必须和switch的表达式数据类型一致
var n1 int32 = 20 var n2 int64 = 20 switch n1 { case n2: // 错误,因为n2的数据类型和n1的不一致 fmt.Println("ok1") default: fmt.Println("没有匹配到") }
3).case后可以带多个表达式,使用逗号间隔
var n1 int32 = 20 var n2 int32 = 21 switch n1 { case n2, 22, 20: // case后可以有多个表达式 fmt.Println("ok1") default: fmt.Println("没有匹配到") }
4).case后面的表达式如果是常量值,则要求不能重复
var n1 int32 = 20 var n2 int32 = 21 switch n1 { case n2, 22, 20: // case后可以有多个表达式 fmt.Println("ok1") case 22: //错误,前面有常量22,重复了,所以报错 fmt.Println("ok2") default: fmt.Println("没有匹配到") }
5).case后面不需要带break,程序匹配到一个case后,就会执行case后面相应的代码块,然后退出switch,如果一个都匹配不到,就执行default后面的代码块
6).default语句不是必须的
7).switch后面也可以不带表达式,类似多个if--else分支来使用
var age int = 20 switch { case age == 20: fmt.Println("age==20") case age == 20: fmt.Println("age==20") default: fmt.Println("没有匹配到") } //case中也可以对范围进行判断 var score int = 30 switch { case score > 80: fmt.Println("成绩优秀") case score > 70 && score <= 80: fmt.Println("成绩良好") case score > 60 && score <= 70: fmt.Println("成绩及格") default: fmt.Println("成绩不及格") }
8).switch后也可以直接声明/定义一个变量,分号结束,但是不推荐这样使用
switch score := 90; { case score > 80: fmt.Println("成绩优秀") case score > 70 && score <= 80: fmt.Println("成绩良好") case score > 60 && score <= 70: fmt.Println("成绩及格") default: fmt.Println("成绩不及格") }
9).switch穿透:fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透
var num int = 10 switch num { case 10: fmt.Println("ok", num) fallthrough //默认只能穿透一层 case 20: fmt.Println("ok", num) case 30: fmt.Println("ok", num) default: fmt.Println("no") }
10).Type Switch:switch语句还可以被用于type-switch来判断某个interface变量中实际指向的变量类型
//案例
// 小写类型的 a b c d e转换成大写,其他的other,键盘输入
var char byte
fmt.Println("请输入一个字符:")
fmt.Scanf("%c", &char)
switch char {
case 'a', 'b', 'c', 'd', 'e':
fmt.Printf("字符%c的大写为:%v", char, strings.ToUpper(string(char)))
default:
fmt.Println("other")
}
switch和if的比较
1).如果判断的具体数值不多,而且符合整数,浮点数,字符,字符串这几种类型,建议使用switch语句,简介高效
2).其他情况:对区间判断和结果为bool类型的判断,使用if,if的使用范围更加广泛