switch 语句

switch 语句也是一种经典控制语句,可以看做是 if-else 语句链的简写。

/_src/tour/switch.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
    "fmt"
    "runtime"
)


func main() {
    fmt.Print("Go runs on ")

    switch os := runtime.GOOS; os {
        case "darwin":
            fmt.Println("OS X.")

        case "linux":
            fmt.Println("Linux.")

        default:
            // freebsd, openbsd
            // plan9, windows...
            fmt.Printf("%s.\n", os)
    }
}

Go 语言 switch 结构跟 CC++JavaJavaScript 以及 PHP 等类似, 不同的是, Go 只执行匹配的 case 代码体,不包括下面的。 对于其他语言,一般需要在每个 case 末尾处用 break 语句来结束。 实际上, Go 相当于自动在每个 case 末尾添加了 break 语句, 这避免了大量因为漏掉 break 而导致的错误。

另外, Go 语言 switch 更为灵活, case 条件不必是常量,也不必是整数。

检查顺序

switch 从上往下对 case 进行检查,直到匹配。

/_src/tour/switch-evaluation-order.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
    "fmt"
    "time"
)


func main() {
    fmt.Println("When's Saturday?")
    today := time.Now().Weekday()
    switch time.Saturday {
        case today + 0:
            fmt.Println("Today.")
        case today + 1:
            fmt.Println("Tomorrow.")
        case today + 2:
            fmt.Println("In two days.")
        default:
            fmt.Println("Too far away.")
    }
}

举另一个例子,如果 i 的值为零,那么函数 f 就不会被调用了:

switch i {
    case 0:
    case f():
}

省略条件

Go 语言, switch 条件可以省略,等价于 switch true 。 这种结构非常简洁,可以用来代替过长的 if-else 链。

/_src/tour/switch-with-no-condition.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import (
    "fmt"
    "time"
)


func main() {
    t := time.Now()
    switch {
        case t.Hour() < 12:
            fmt.Println("Good morning!")
        case t.Hour() < 17:
            fmt.Println("Good afternoon.")
        default:
            fmt.Println("Good evening.")
    }
}

下一步

下一节 我们一起来看看 Go 语言 defer 语句

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png

小菜学编程

微信打赏