前言
switch
语句用于基于不同条件执行不同动作,每一个case
分支都是唯一的,从上至下逐一测试,直到匹配为止。switch
语句执行的过程从上至下,直到找到匹配项。switch
默认情况下case
最后自带break
语句,所以不需要再额外添加,匹配成功后就不会执行其他case
,如果我们需要执行后面的case
,可以使用fallthrough
。
语法
switch exp {
case val1:
...
case val2:
...
default:
...
}
demo
var exp = 2
switch exp {
case 1:
fmt.Println("匹配到 1")
case 2:
fmt.Println("匹配到 2")
case 3:
fmt.Println("匹配到 3")
case 4:
fmt.Println("匹配到 4")
}
// 匹配到 2
详解
switch
常见用法就是通过判断表达式exp
是否满足case
中的条件,如果满足就执行case
后的动作
,如果不满足,继续判断,直到找到满足的case
var exp = 2
switch exp {
case 1:
fmt.Println("匹配到 1")
case 2:
fmt.Println("匹配到 2")
case 3:
fmt.Println("匹配到 3")
case 4:
fmt.Println("匹配到 4")
}
// 匹配到 2
- 如果所有的
case
都没有匹配到,则switch
中的动作
都不会被执行
var exp = 5
var val = 0
switch exp {
case 1:
val = 1
fmt.Println("匹配到 1")
case 2:
val = 2
fmt.Println("匹配到 2")
case 3:
val = 3
fmt.Println("匹配到 3")
case 4:
val = 4
fmt.Println("匹配到 4")
}
fmt.Println("val 的值为 :", val)
// val 的值为 : 0
- 如果所有的case都不满足,可以配置默认
动作
,默认动作配置到default
后
var exp = 5
switch exp {
case 1:
fmt.Println("匹配到 1")
case 2:
fmt.Println("匹配到 2")
case 3:
fmt.Println("匹配到 3")
case 4:
fmt.Println("匹配到 4")
default:
fmt.Println("没有匹配到...")
// 没有匹配到...
- 如果一个
case
后需要写多个条件
,则通过条件1,条件2...
语法实现即可
var exp = 2
switch exp {
case 1:
fmt.Println("匹配到 1")
case 2,3,4:
fmt.Println("匹配到 2")
}
// 匹配到 2
- 如果匹配到指定
case
后,执行完该case
后的动作,希望能执行相邻的下一个case后的动作
,则通过fallthrough
可以实现。每一个fallthrough
可以实现一次穿透
动作,不管下边的case
条件是否满足
var exp = 2
switch exp {
case 1:
fmt.Println("匹配到 1")
case 2:
fmt.Println("匹配到 2")
fallthrough
case 3:
fmt.Println("匹配到 3")
case 4:
fmt.Println("匹配到 4")
}
// 匹配到 2
// 匹配到 3
- 如果想
穿透
多个case
,则可以再每个case
动作后都添加一个fallthrough
关键字
var exp = 2
switch exp {
case 1:
fmt.Println("匹配到 1")
case 2:
fmt.Println("匹配到 2")
fallthrough
case 3:
fmt.Println("匹配到 3")
fallthrough
case 4:
fmt.Println("匹配到 4")
}
// 匹配到 2
// 匹配到 3
// 匹配到 4
- 如果需要处理多表达式,例如
表达式1 == true
执行动作1
,表达式2 == true
执行动作2
… ,可以通过以下语法实现:
switch {
case exp1:
action1
case exp2:
action2
... ...
default :
actionN
}
例如:
switch {
case 2 > 3:
fmt.Println("2 > 3")
case 3 > 4:
fmt.Println("3 > 4")
case 2 < 3:
fmt.Println("2 < 3")
case 4 > 5:
fmt.Println("4 > 5")
}
// 2 < 3
前边提到的规则
和fallthrough
关键字,对这种情况也同样生效
swtich
还可以做interface{}
变量类型判断,例如接口传参为interface{}
类型,或是第三方接口返回变量为interface{}
类型等
var i interface{} = 0
switch i.(type) {
case int:
fmt.Println("int")
case string:
fmt.Println("string")
}
// int
总结
switch
语句为golang
中常用的分支语句,熟练掌握其语法特性在后续的研发工作中,会避免很多不必要的麻烦,同时针对一些特殊场景,swtich
语句的特性也许会起到意向不到的作用