Switch不是一堆ifs。它更类似于if {} else if {}
构造,但有一些曲折 - 即break
和fallthrough
。不可能让 switch 执行第一种和第三种情况 - switch 不会检查每个条件,它会找到第一个匹配并执行它。就这样。
它的主要目的是遍历可能值的列表并为每个值执行不同的代码。实际上,在 C(switch 语句的来源)中,switch 表达式只能是整数类型,而 case 值只能是 switch 表达式也将被比较的常量。直到最近,语言才开始在 switch case 中添加对字符串、布尔表达式等的支持。
至于 fallthrough 逻辑,它也来自 C。C 中没有 fallthrough 运算符。在 C 中,除非遇到 break 运算符,否则执行会进入下一个 case(不检查 case 值)。这种设计的原因是有时您需要做一些特殊的事情,然后执行与另一种情况相同的步骤。所以,这个设计只是允许这样做。不幸的是,它很少有用,所以默认情况下,当程序员忘记放入一个 break 语句时,默认情况下会造成更多麻烦,然后在真正故意省略该 break 时提供帮助。因此,许多现代语言将这种逻辑更改为默认情况下永远不会失败,并且如果确实需要失败,则需要明确的失败语句。
不幸的是,很难想出一个非人为的例子来说明失败是有用的,它足够短以适应答案。正如我所说,这是相对罕见的。但有时你需要编写类似这样的代码:
if x == a || x == b {
if x == a {
// do action a
}
// do action ab
} else if x == c {
// do action c
} else if x == d {
// do action d
}
事实上,我最近在我的一个项目中需要类似结构的代码。所以,我改用 switch 语句。它看起来像这样:
switch x {
case a: // do action a
fallthrough
case b: // do action ab
case c: // do action c
case d: // do action d
}
你从这个问题的切换在功能上等同于:
if 1 == 1 || 2 == 1 {
if 1 == 1 {
fmt.Println("1 == 1")
}
fmt.Println("2 == 1")
}