25 Go 条件控制语句switch
golang语言,switch分支控制语句使用
switch语句基本结构如下
switch 表达式1 {
case 表达式2,表达式3,...:
语句块1
case 表达式4,表达式5:
语句快2
default:
默认语句
}
注意事项:
1 switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,
如果相等就执行对应case下的语句块,然后退出switch控制。
2 如果switch的表达式值没有和任何case的表达式匹配成功,则执行default下的语句块,然后退出switch控制。
3 golang的case后可以有多个表达式,用英文逗号,分隔。
4 golang中的case语句块结束时不需要写break,因为在默认情况下,当程序执行完case下的语句块后会直接退出switch控制。
5 case/switch后是一个表达式(常量值/变量/一个没有返回值的函数等都可以)
6 case后各个表达式的值数据类型,必须和switch表达式的数据类型一致(同if语句)
7 case后面的表达式如果是常量值,则要求不能重复
8 default语句不是必须的
9 switch后面也可以不带表达式,此时,默认switch后是true值。则后续case后跟上逻辑判断(像if语句一样使用)
10 switch后也可以先申明一个变量,分号结束,再跟上表达式。此种方式不推荐
11 switch穿透 fallthrough,如果在case语句块最后跟上fallthrough,则会继续执行下一个case内的代码块,也叫switch穿透。fallthrough默认只能穿透一层case
12 Type Switch:switch语句还可以被用于type-switch来判断某个interface变量中实际指向的变量类型
demo1
同if/else语句,条件的变量类型必须相同,否则报错,如下:
1 var n1 int32 = 1 2 var n2 int64 = 2 3 if n1 < n2 { // invalid operation: n1 < n2 (mismatched types int32 and int64) 4 fmt.Println("OK") 5 } 6 7 switch n1 { 8 case n2: // invalid case n2 in switch on n1 (mismatched types int64 and int32) 9 fmt.Println("OK") 10 default: 11 fmt.Println("未匹配到!") 12 }
demo2
在switch后使用变量声明语句,在case后做条件判断
1 switch a := 4; { 2 case a == 1: 3 fmt.Println("a = 1") 4 case a == 2: 5 fmt.Println("a = 2") 6 case a == 3: 7 fmt.Println("a = 3") 8 default: 9 fmt.Println("未匹配到相等的值!") // 未匹配到相等的值! 10 } 11 // 以上语句每个case后的关系运算都会被执行,同if else
demo3
fallthrough
1 // fallthrough练习 2 switch num:=10; num { 3 case 5: 4 fmt.Println("ok5") 5 case 10: 6 fmt.Println("ok10") // ok10 7 fallthrough 8 case 20: 9 fmt.Println("ok20") // ok20 10 case 30: 11 fmt.Println("ok30") 12 default: 13 fmt.Println("没有匹配到...") 14 }
demo4
type switch的使用
1 var x interface{} 2 var y = 10.0 3 x = y 4 switch i := x.(type) { 5 case nil: 6 fmt.Printf("x 的类型是 %T \n", i) 7 case int: 8 fmt.Println("x 的类型是 int") 9 case float64: 10 fmt.Println("x 的类型是 float64") // x 的类型是 float64 11 case func(int) float64: 12 fmt.Println("x 的类型是 func(int)") 13 case bool, string: 14 fmt.Println("x 的类型是 bool 或 string") 15 default: 16 fmt.Println("未知类型") 17 }
习题:
1 // 练习1 2 // 每周一三五写接口,二四六写前端页面,周日休息 3 switch time.Now().Weekday() { 4 case time.Monday, time.Wednesday, time.Friday : 5 fmt.Println("今天写接口!") 6 case time.Tuesday, time.Thursday, time.Saturday : 7 fmt.Println("今天写前端页面!") 8 default: 9 fmt.Println("今天休息吧!") 10 }
1 // 练习2 2 // 使用switch把小写类型的char转成大写,只转换abcde,其他的输出other 3 var input byte 4 fmt.Println("请输入一个小写字母:") 5 fmt.Scanf("%c \n", &input) 6 switch input { 7 case 'a': 8 fmt.Println("A") 9 case 'b': 10 fmt.Println("B") 11 case 'c': 12 fmt.Println("C") 13 case 'd': 14 fmt.Println("D") 15 case 'e': 16 fmt.Println("E") 17 default: 18 fmt.Println("other char") 19 }
1 // 练习3 2 // 对学习成绩大于60的,输出“合格”,低于60分的输出“不合格”。注:输入的成绩不能高于100 3 var score uint8 4 fmt.Println("请输入考生成绩:") 5 fmt.Scanf("%d \n", &score) 6 switch { 7 case score >= 60 && score <= 100 : 8 fmt.Println("合格") 9 case score >= 0 && score < 60 : 10 fmt.Println("不合格") 11 default: 12 fmt.Println("输入的成绩不能高于100") 13 }
1 // 练习4 2 // 根据用户输入的月份,输出该月份所属的季节 3 var month uint8 4 fmt.Println("请输入月份:") 5 fmt.Scanf("%d \n", &month) 6 switch month { 7 case 3,4,5: 8 fmt.Printf("%d 月是春季 \n", month) 9 case 6,7,8: 10 fmt.Printf("%d 月是夏季 \n", month) 11 case 9,10,11: 12 fmt.Printf("%d 月是秋季 \n", month) 13 case 12,1,2: 14 fmt.Printf("%d 月是冬季 \n", month) 15 default: 16 fmt.Println("请输入1~12月!") 17 }
var n1 int32 = 1
var n2 int64 = 2
if n1 < n2 { // invalid operation: n1 < n2 (mismatched types int32 and int64)
fmt.Println("OK")
}
switch n1 {
case n2: // invalid case n2 in switch on n1 (mismatched types int64 and int32)
fmt.Println("OK")
default:
fmt.Println("未匹配到!")
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具