Go语言switch语句

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 进行检查,直到匹配。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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 就不会被调用了:

1
2
3
4
switch i {
    case 0:
    case f():
}

省略条件

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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语言】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学Go语言】系列文章首发于公众号【小菜学编程】,敬请关注: