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("未匹配到!")
}
posted @ 2022-06-27 22:24  风铃如沧海  阅读(105)  评论(0编辑  收藏  举报