switch 结构使用灵活,它接受任意形式的表达式:

    1. switch var1 {
    2. case val1:
    3. ...
    4. case val2:
    5. ...
    6. default:
    7. ...
    8. }

    变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 { 必须和 switch 关键字在同一行。
    您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3
    每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。( Go 语言使用快速的查找算法来测试 switch 条件与 case 分支的匹配情况,直到算法匹配到某个 case 或者进入 default 条件为止。)
    一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块,也就是说您不需要特别使用 break 语句来表示结束。
    因此,程序也不会自动地去执行下一个分支的代码。如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。

    1. switch i {
    2. case 0: // 空分支,只有当 i == 0 时才会进入分支
    3. case 1:
    4. f() // 当 i == 0 时函数不会被调用
    5. }
    6. switch i {
    7. case 0: fallthrough
    8. case 1:
    9. f() // 当 i == 0 时函数也会被调用
    10. }

    case ...: 语句之后,您不需要使用花括号将多行语句括起来,但您可以在分支中进行任意形式的编码。当代码块只有一行时,可以直接放置在 case 语句之后。
    您同样可以使用 return 语句来提前结束代码块的执行。当您在 switch 语句块中使用 return 语句,并且您的函数是有返回值的,您还需要在 switch 之后添加相应的 return 语句以确保函数始终会返回。
    可选的 default 分支可以出现在任何顺序,但最好将它放在最后。它的作用类似与 if-else 语句中的 else,表示不符合任何已给出条件时,执行相关语句。
    switch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true),然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,该分支的代码会被执行。这看起来非常像链式的 if-else 语句,但是在测试条件非常多的情况下,提供了可读性更好的书写方式。

    1. var num1 int = 7
    2. switch {
    3. case num1 < 0:
    4. fmt.Println("Number is negative")
    5. case num1 > 0 && num1 < 10:
    6. fmt.Println("Number is between 0 and 10")
    7. default:
    8. fmt.Println("Number is 10 or greater")
    9. }

    switch 语句的第三种形式是包含一个初始化语句:

    1. switch result := calculate(); {
    2. case result < 0:
    3. ...
    4. case result > 0:
    5. ...
    6. default:
    7. // 0
    8. }
    9. var t int
    10. switch a, b := x[i], y[j]; {
    11. case a < b: t = -1
    12. case a == b: t = 0
    13. case a > b: t = 1
    14. }