概述
switch 分支控制
- 基本的介绍
- switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一测试,直到匹配为止。
- 匹配项后面也不需要再加 break
- 基本语法
switch 表达式{
case 表达式1,表达式2,...:
语句块1
case 表达式3,表达式4,...:
语句块2
//这里可以有多个case语句
default:
语句块
}
- switch 的流程图
- 对上图的说明和总结
- switch 的执行的流程是,先执行表达式,得到值,然后和 case 的表达式进行比较,如果相等,就匹配到,然后执行对应的 case 的语句块,然后退出 switch 控制。
- 如果 switch 的表达式的值没有和任何的 case 的表达式匹配成功,则执行 default 的语句块。执行后退出 switch 的控制.
- golang 的 case 后的表达式可以有多个,使用 逗号 间隔
- golang 中的 case 语句块不需要写 break , 因为默认会有,即在默认情况下,当程序执行完 case 语句块后,就直接退出该 switch 控制结构。
- 演示案例
- 请编写一个程序,该程序可以接收一个字符,比如: a,b,c,d,e,f,g a表示星期一,b表示星期二 … 根据用户的输入显示相依的信息.要求使用 switch 语句完成
//分析思路
//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("周三")
//...
default:
fmt.Println("输入有误...")
}
- 输出结果:
switch 的使用的注意事项和细节
- case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)
//写一个非常简单的函数
func test(char byte) byte {
return char + 1
}
func main() {
var key byte
fmt.Println("请输入一个字符 a,b,c,d,e,f,g")
fmt.Scanf("%c", &key)
switch test(key)+1 { //将语法现象
case 'a':
fmt.Println("周一, 猴子穿新衣")
case 'b':
fmt.Println("周二,猴子当小二")
case 'c':
fmt.Println("周三,猴子爬雪山")
//...
default:
fmt.Println("输入有误...")
}
}
- case 后的各个表达式的值的数据类型,必须和 switch 的表达式数据类型一致
- case 后面可以带多个表达式,使用逗号间隔。
- 比如 case 表达式 1, 表达式 2 ...
var n1 int32 = 51
var n2 int32 = 20
switch n1 {
case n2, 10, 5 : // case 后面可以有多个表达式
fmt.Println("ok1")
case 90 :
fmt.Println("ok2~")
}
- case 后面的表达式如果是常量值(字面量),则要求不能重复
- case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch,如果一个都匹配不到,则执行 default
- default 语句不是必须的.
- switch 后也可以不带表达式,类似 if --else 分支来使用。
//switch 后也可以不带表达式,类似 if --else分支来使用
var age int = 10
switch {
case age == 10 :
fmt.Println("age == 10")
case age == 20 :
fmt.Println("age == 20")
default :
fmt.Println("没有匹配到")
}
//case 中也可以对 范围进行判断
var score int = 90
switch {
case score > 90 :
fmt.Println("成绩优秀..")
case score >=70 && score <= 90 :
fmt.Println("成绩优良...")
case score >= 60 && score < 70 :
fmt.Println("成绩及格...")
default :
fmt.Println("不及格")
}
- switch 后也可以直接声明/定义一个变量,分号结束,不推荐
switch grade := 90; { // 在golang中,可以这样写
case grade > 90 :
fmt.Println("成绩优秀~..")
case grade >=70 && grade <= 90 :
fmt.Println("成绩优良~...")
case grade >= 60 && grade < 70 :
fmt.Println("成绩及格~...")
default :
fmt.Println("不及格~")
}
- switch 穿透-fallthrough ,如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也叫 switch 穿透
var num int = 10
switch num {
case 10:
fmt.Println("ok1")
fallthrough //默认只能穿透一层
case 20:
fmt.Println("ok2")
fallthrough
case 30:
fmt.Println("ok3")
default:
fmt.Println("没有匹配到..")
}
- 输出结果:
- Type Switch:switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的变量类型
switch 的案例演示
- 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出“other”。
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")
}
- 对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。(注:输入的成绩不能大于 100)
var score float64
fmt.Println("请输入成绩")
fmt.Scanln(&score)
switch int(score / 60) {
case 1:
fmt.Println("及格")
case 0:
fmt.Println("不及格")
default:
fmt.Println("输入有误..")
}
- 根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
var month byte
fmt.Println("请输入月份")
fmt.Scanln(&month)
switch month {
case 3, 4, 5 :
fmt.Println("spring")
case 6, 7, 8 :
fmt.Println("summer")
case 9, 10, 11 :
fmt.Println("autumn")
case 12, 1, 2 :
fmt.Println("winter")
default:
fmt.Println("输入有误..")
}
switch 和 if 的比较
- 如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。
- 建议使用 swtich语句,简洁高效。
- 其他情况:对区间判断和结果为 bool 类型的判断,使用 if,if 的使用范围更广。
最后
以上就是陶醉太阳为你收集整理的Go switch 分支控制基础使用及细节的全部内容,希望文章能够帮你解决Go switch 分支控制基础使用及细节所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复