Go 语言提供了两种主要形式的 switch
语句,它们分别有不同的用途和特点。
1. 基于值的 switch
这种形式的 switch
语句是基于一个表达式的值来决定执行哪个 case
语句块。这与许多其他编程语言中的 switch
语句相似。
语法:
switch expression {
case value1:
// code to be executed if expression == value1
case value2:
// code to be executed if expression == value2
case value3, value4:
// code to be executed if expression == value3 or expression == value4
default:
// code to be executed if none of the cases are true
}
特点:
- 每个
case
后面跟的是一个或多个值,当expression
的值等于这些值之一时,该case
语句块会被执行。 - 不需要使用
break
语句结束每个case
。在 Go 中,switch
语句默认只执行匹配的case
语句块,然后退出switch
结构。 - 可以使用逗号分隔多个值,表示多个值中的任何一个都可以匹配。
default
语句是可选的,当没有case
语句匹配时,会执行default
语句块。
2. 条件式的 switch
这种形式的 switch
不基于特定的值,而是基于一组布尔条件。
语法:
switch {
case condition1:
// code to be executed if condition1 is true
case condition2:
// code to be executed if condition2 is true
default:
// code to be executed if none of the conditions are true
}
特点:
- 不需要主表达式,每个
case
后跟的是一个布尔条件。 - 当布尔条件为
true
时,相应的case
语句块会被执行。 - 同样,不需要使用
break
语句。 - 可以有一个
default
语句块,当没有case
语句匹配时,会执行default
语句块。
示例:
num := 75
switch {
case num >= 50 && num < 100:
fmt.Println("num is between 50 and 100")
case num < 50:
fmt.Println("num is less than 50")
default:
fmt.Println("num is 100 or greater")
}
总的来说,基于值的 switch
更适用于当你有一个表达式并且想基于它的不同值执行不同的代码块时。而条件式的 switch
更适用于当你有多个不相关的条件,并且想基于这些条件的真实性执行不同的代码块时。
Go 语言中的 switch
语句的匹配规则如下:
-
顺序匹配:
switch
会从上到下评估每个case
,并且只执行第一个匹配的case
语句块。一旦找到匹配的case
,后续的case
就不会再被评估。 -
不需要
break
:与许多其他编程语言不同,Go 中的switch
语句块在执行完匹配的case
后不会“穿透”到下一个case
。这意味着不需要在每个case
的末尾使用break
语句。但如果你确实想“穿透”到下一个case
,可以使用fallthrough
语句。 -
多值匹配:在一个
case
语句中,你可以列出多个值(使用逗号分隔),如果表达式的值匹配列表中的任何一个值,该case
语句块都会被执行。 -
默认 case:
default
是一个特殊的case
,当没有其他case
匹配时,它会被执行。default
语句块是可选的,并且在switch
语句中最多只能有一个。 -
表达式是可选的:在条件式
switch
中,主switch
表达式是可选的。在这种情况下,每个case
后面都跟着一个布尔表达式,而不是值。switch
会评估这些布尔表达式并执行第一个为true
的case
。 -
初始化语句:与
if
语句类似,switch
语句可以包含一个可选的初始化语句,它在评估switch
或case
表达式之前执行。switch num := 50; { case num < 50: // some code case num >= 50: // some code }
-
fallthrough
语句:如果你想在执行完当前的case
语句块后,继续执行下一个case
语句块,你可以使用fallthrough
语句。但要注意,fallthrough
不会再次评估下一个case
的条件,而是直接执行。
上述规则为你提供了使用 Go 语言 switch
语句的灵活性和控制能力,使其成为一个非常强大的控制结构。