switch分支结构:
1)switch语句用于基本不同条件执行不同动作,每一个 case分支都是唯一的,从上到下逐一测试,直到匹配为止。
2)匹配项后面也不需要在加break
基本语法:
swith 表达式 {
case 表达式1,表达式2,...:
语句块1
case 表达式3,表达式4,... :
语句块2
//这里可以有多个case语句
default:
语句块
}
对上图的说明和总结
1)switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的case的语句块然后退出switch控制。
2)如果switch 的表达式的值没有和任何的case的表达式匹配成功,则执行default的语句块。执行后退出switch控制。
3)在golang中case 后的表达式可有多个,使用 逗号 间隔。
4)在golang中不需要写break,因为默认会有 break。在默认情况下,当程序执行完一个case语句块后就直接退出该switch控制。
案例;
请编写一个程序,改程序可以接受一个字符,比如:a,b,c,d,e,f,g
a表示星期一,b表示星期二 ... 根据用户输入的显示相应的的信息。
要求使用switch 语句完成
代码编写:
func main() {
//1.定义一个变量接收字符
//2.使用switch完成
var key byte
fmt.Println("请输入一个字符 a,b,c,d,e,f,g")
fmt.Scanf("%c", &key)
switch key {
case 'a' :
fmt.Println("周一, 猴子穿新衣")
case 'b' :
fmt.Println("周二, 猴子当小二")
case 'c' :
fmt.Println("周三,猴子去爬山")
case 'd' :
fmt.Println("周四,猴子去考试")
case 'e' :
fmt.Println("周五,猴子去跳舞")
case 'f' :
fmt.Println("周六,猴子去溜溜")
case 'g' :
fmt.Println("周日,猴子过生日 ")
default:
fmt.Println("输入错误...")
}
}
switch细节讨论:
1)case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以,甚至还可以运算)
2)case后的各个表达式的值的数据类型,必须和switch 的表达式数据类型一致
func main() {
var n1 int32 = 20
var n2 int64 = 20
switch n1 {
case n2 : //错误,原因是 n2的数据类型和n1不一致
fmt.Println("ok1")
default :
fmt.Println("没有匹配到")
}
}
3)case后面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2...
func main() {
var n1 int32 = 5
var n2 int32 = 20
switch n1 {
case n2, 10, 5 : // case 后面可以有多个表达式,n1会跟n2, 10, 5都匹配一遍。
fmt.Println("ok1")
default :
fmt.Println("没有匹配到")
}
}
4)case后面的表达式如果是常量值(字面量),则要求不能重复
5) case后面不需要带break,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default
6)default 语句不是必须的。
7)switch 后也可以不带表达式,类似多个if--else分支来使用。
func main() {
var age int = 10
switch {
case age == 10 :
fmt.Println("age == 10")
case age == 20 :
fmt.Println("age == 20")
default :
fmt.Println("没有匹配到")
}
}
8)switch 后也可以直接声明/定义一个变量,分号结束,不推荐。
9)switch 穿透-fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透。
func main() {
//switch 的穿透 fallthrough
var num int = 10
switch num {
case 10 :
fmt.Println("ok1")
fallthrough //默认只能穿透一层
case 20 :
fmt.Println("ok2")
case 30 :
fmt.Println("ok3")
default :
fmt.Println("没有匹配到")
}
}
10)Type Switch:switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的变量类型 【还没有学interface,先体验一把】
func main() {
var x interface{}
var y = 10.0
x = y
switch i := x.(type) {
case nil:
fmt.Printf(" x 的类型~ :%T",i)
case int:
fmt.Printf(" x 是 int 型")
case float64:
fmt.Printf(" x 是 float64 型")
case func(int) float64:
fmt.Printf(" x 是 func(int) 型")
case bool, string:
fmt.Printf(" x 是 bool 或 string 型")
default:
fmt.Printf("未知型")
}
}
练习:
1、使用switch把小写类型的 char型转为大写(键盘输入)。只转换a,b,c,d,e 其它的输出“other”。
func main() {
var char byte
fmt.Println("请输入一个字符:")
fmt.Scanf("%c", &char)
switch char {
case 'a' :
fmt.Println("A")
case 'b' :
fmt.Println("B")
case 'c' :
fmt.Println("C")
case 'd' :
fmt.Println("D")
case 'e' :
fmt.Println("E")
default :
fmt.Println("other")
}
}
2、对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。(注:输入的成绩不能大于100)
func main() {
var score int
fmt.Println("请输入成绩:")
fmt.Scanln(&score)
switch {
case score >= 60 && score <= 100 :
fmt.Println("及格")
case score >= 0 && score < 60 :
fmt.Println("不及格")
default :
fmt.Println("输入有误...")
}
}
3、根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12,1,2 冬季
func main() {
var month byte
fmt.Println("请输入月份")
fmt.Scanln(&month)
switch month {
case 3, 4, 5 :
fmt.Println("春季")
case 6, 7, 8 :
fmt.Println("夏季")
case 9, 10, 11 :
fmt.Println("秋季")
case 12, 1, 2 :
fmt.Println("冬季")
default :
fmt.Println("你输入错误")
}
}
4、根据用户输入显示对应的星期时间(string),如果“星期一”,显示“干煸豆角” ,如果“星期二”,显示“醋溜土豆”,如果“星期三”,显示“红烧狮子头”,如果“星期四”,显示“油炸花生米”,如果“星期五”,显示“蒜蓉扇贝”,如果“星期六”,显示“东北乱炖”,如果“星期日”,显示“大盘鸡”。
func main() {
var week string
fmt.Println("请输入星期几:")
fmt.Scanln(&week)
switch week {
case "星期一" :
fmt.Println("干煸豆角")
case "星期二" :
fmt.Println("醋溜土豆")
case "星期三" :
fmt.Println("红烧狮子头")
case "星期四" :
fmt.Println("油炸花生米")
case "星期五" :
fmt.Println("蒜蓉扇贝")
case "星期六" :
fmt.Println("东北乱炖")
case "星期日" :
fmt.Println("大盘鸡")
default :
fmt.Println("您输入错误")
}
}
switch 和 if 的比较:
1)如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用switch语句,简洁高效。
2)其他情况,对区间判断和结果为bool类型的判断,使用if,if的使用范围更广。