Go 语言 switch 的使用
一、基本介绍:
- switch 语句 基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下执行,直到匹配为止。
- 匹配项后面不需要加 break。
基本语法:
switch 表达式 {
case 表达式1,表达式2,…:
语句块1
case 表达式3,表达式4:
语句块2
default:
语句块3
}
switch 大体流程:
- 先执行表达式,得到值,和 case 表达式进行比较,如果匹配到,就执行 case 的语句块,然后退出 switch 控制;
- 若 switch 的表达式值,没有和任何 case 的表达式匹配成功,执行 default 语句块,然后退出 switch 控制;
- go 中 case 后的表达式可以有多个,使用 逗号隔开;
- go 中 case 语句块不需要写break,因为默认会有;
简单举个栗子:
-
输入一个字符,跟对应的字符进行匹配,输出不同的结果:
package main import ( "fmt" ) func main(){ // 1.定义一个变量接收字符 // 2.使用switch 完成 var key byte fmt.Println("输入a, b, c, d字符, 进行匹配") fmt.Scanf("%c", &key) switch key { case 'a': fmt.Println("输入的是a") case 'b': fmt.Println("输入的是b") case 'c': fmt.Println("输入的是c") case 'd': fmt.Println("输入的是d") default: fmt.Println("输入超出范围") } }
二、使用细节、注意事项:
-
case/switch 后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以):
// 写一个简单的函数 func test(char byte) byte{ return char } func main(){ var key byte fmt.Println("输入a,b,c,d 对应获取不同的结果") fmt.Scanf("%c", &key) // case/switch 后面可以是一个有返回值的函数 switch test(key) { case 'a': fmt.Println("输入的是a") case 'b': fmt.Println("输入的是b") case 'c': fmt.Println("输入的是c") case 'd': fmt.Println("输入的是d") default: fmt.Println("输入超出范围") } }
-
case 后 的表达式的值数据类型,必须和 switch 表达式数据类型一致:
func main(){ var i int32 var j int64 // switch 后面表达式 跟case后面表达式 数据类型不同 错误示范 switch i { case j: fmt.Println("ok") default: fmt.Println("输出default里面内容") } }
-
case 后面可以跟多个表达式,使用逗号隔开:
func main(){ var i int32 var j int32 var k int32 // case 后面可以跟多个表达式, 使用逗号隔开 switch i { case j, k, 10: fmt.Println("ok") default: fmt.Println("输出default里面内容") } }
-
case 后面的表达式,如果是常量值(字面值),要求不能重复:
func main(){ var n1 int32 = 5 var n2 int32 = 20 // 值 不能进行重复使用, 常量5已经使用 第二个case 则不能再次使用 switch n1 { case n2, 5: fmt.Println("ok1") case 5: fmt.Println("ok2") default: fmt.Println("输出default里面内容") } }
-
case 后面 不需要带 break;
-
default 语句并不是必须的:
func main(){ var n1 int32 = 5 var n2 int32 = 20 // default 语句并不是必有的 switch n1 { case n2, 5: fmt.Println("ok1") } }
-
switch 后 可以不带表达式,类似 if—else 分支来使用:
func main(){ var n1 int32 = 5 // switch 语句后, 不需要跟表达式 类似 if --- else 分支 switch { case n1 == 5: fmt.Println("ok1") case n1 == 10: fmt.Println("ok2") default: fmt.Println("default") } var age int64 = 18 switch { case age >= 18 && age < 60: fmt.Println("成人票") case age < 18 && age >= 15: fmt.Println("青年票") case age > 12 : fmt.Println("儿童票") default: fmt.Println("是什么票呢?") } }
-
switch 后 也可以直接声明、定义一个变量,分号结束,
不推荐使用
:func main(){ // switch 语句后,直接声明、定义一个变量, 不推荐使用, 用分号结束 switch age:= 18;{ case age >= 18 && age < 60: fmt.Println("成人票") case age < 18 && age >= 15: fmt.Println("青年票") case age > 12 : fmt.Println("儿童票") default: fmt.Println("是什么票呢?") } }
-
switch 穿透 fallthrough,如果在 case 语句后增加fallthrough,会继续执行下一个 case,也叫switch 穿透:
func main(){ // switch fallthrough 的使用 var age int64 = 18 switch { case age >= 18 && age < 60: fmt.Println("成人票") fallthrough case age < 18 && age >= 15: fmt.Println("青年票") case age > 12 : fmt.Println("儿童票") default: fmt.Println("是什么票呢?") } }
三、switch 和 if 使用场景:
- 如果判断具体数值不多,符合 整数、浮点数、字符、字符串 几种类型。建议使用switch语句,高效简洁。
- 对区间判断和结果为bool类型判断,使用if范围更广。