基本用法
switch
关键字后面接条件表达式case
从上到下按顺序进行匹配,直到匹配成功- 如果没有匹配到
case
, 且有 default
模式, 会执行 default
的代码块
1
2
3
4
5
6
7
8
9
10
| func defaultSwitch() {
switch time.Now().Weekday() {
case time.Saturday:
fmt.Println("Today is Saturday.")
case time.Sunday:
fmt.Println("Today is Sunday.")
default:
fmt.Println("Today is a weekday.")
}
}
|
没有条件表达式
switch
关键字后没有条件表达式, 默认认为是 true
1
2
3
4
5
6
7
8
9
10
11
| func noConditionSwitch() {
hour := time.Now().Hour()
switch {
case hour < 12:
fmt.Println("Good morning!")
case hour < 17:
fmt.Println("Good afternoon!")
default:
fmt.Println("Good evening!")
}
}
|
Or 匹配
1
2
3
4
5
6
7
8
9
10
11
12
| func orSwitch() {
c := '\t'
var iswhiteSpace bool
switch c {
case ' ', '\t', '\n', '\f', '\r':
iswhiteSpace = true
}
if iswhiteSpace {
fmt.Println("c is a white_space char")
}
}
|
Fallthrough
fallthrough
语句会跳到下一个 case
- 只能放在
case
代码块的最后位置
1
2
3
4
5
6
7
8
9
10
11
12
| func fallthroughSwitch() {
switch 2 {
case 1:
fmt.Println("1")
fallthrough
case 2:
fmt.Println("2")
fallthrough
case 3:
fmt.Println("3")
}
}
|
通过 break 退出 switch
break
语句终止 switch 继续执行- 如果要跳出外层的 for 循环,而不是
switch
,可以在循环上加一个标签,然后 break
到这个标签
1
2
3
4
5
6
7
8
9
10
11
12
13
| func breakSwitch() {
Loop:
for _, ch := range "a b\nc" {
switch ch {
case ' ': // skip space
break
case '\n': // break at newline
break Loop
default:
fmt.Printf("%c\n", ch)
}
}
}
|
执行顺序
- switch 表达式一开始会被执行
- 之后 case 表达式从左到右、从上到下匹配:
- 第一个相等的 case, 会触发匹配到的代码块的执行
- 其他 case 会被忽略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| func executeOrder() {
// Foo prints and returns n.
var Foo func(int) int
Foo = func(n int) int {
fmt.Println(n)
return n
}
switch Foo(2) {
case Foo(1), Foo(2), Foo(3):
fmt.Println("First case")
fallthrough
case Foo(4):
fmt.Println("Second case")
}
}
|