14.1 switch 语句

switch 语句专门用来设计多分支条件结构。与 else/if 多分支结构相比,switch 结构更简洁,执行效率更高。
switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
switch {
    case condition1:
        ...
    case condition2:
        ...
    default:
        ...
}

switch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true),然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,该分支的代码会被执行。

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

switch initialization {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
switch result := calculate(); {
    case result < 0:
        ...
    case result > 0:
        ...
    default:
        // 0
}

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 { 必须和 switch 关键字在同一行。

您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1,val2,val3。 一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块,也就是说您不需要特别使用 break 语句来表示结束。

如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。

fallthrough强制执行后面的case代码,fallthrough不会判断下一条case的expr结果是否为true。

package main
import "fmt"
func main() {
	switch a := 1; {
	case a == 1:
		fmt.Println("The integer was == 1")
		fallthrough
	case a == 2:
		fmt.Println("The integer was == 2")
	case a == 3:
		fmt.Println("The integer was == 3")
		fallthrough
	case a == 4:
		fmt.Println("The integer was == 4")
	case a == 5:
		fmt.Println("The integer was == 5")
		fallthrough
	default:
		fmt.Println("default case")
	}
}
程序输出:
The integer was == 1
The integer was == 2
下一节:select是Go语言中的一个控制结构,类似于switch语句,主要用于处理异步通道操作,所有情况都会涉及通信操作。