Golang 中的 Switch-Case 分支语句

GolangBeginner
立即练习

介绍

在之前的实验中,我们学习了 if-else 分支语句的用法。在本实验中,我们将学习 switch-case 分支语句。与 if-else 语句相比,switch 语句更适合处理多条件的场景。

知识点:

  • switch-case 语句
  • default 关键字
  • fallthrough 关键字
这是一个引导实验,提供了逐步的指导来帮助你学习和练习。请仔细遵循说明完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 100%。它在学习者中获得了 100% 的好评率。

基本语法

switch 分支语句的语法与 if 分支语句类似,因为它们都包含条件判断。基本语法如下:

switch condition {
    case val1:
        // 代码块
    case val2:
        // 代码块
    ...
    default:
        // 代码块
}

条件(condition)可以是任何类型的表达式。当条件与某个 case 语句的值匹配时,对应的 case 语句将被执行,随后程序会退出当前的 switch 分支。

case 语句中的值必须与条件表达式的类型相同。

程序会从上到下评估 case 语句,并执行第一个匹配的 case 语句。执行完成后,程序将退出当前的 switch 分支。

default 语句类似于 else 语句。当没有任何 case 语句匹配条件时,将执行 default 语句。

让我们看一个天气预报的例子。创建一个名为 switch.go 的新文件并编写以下代码:

cd ~/project
touch switch.go
package main

import (
    "fmt"
)

func main() {
    // 今日天气
    weather := "rainy"
    switch weather {
    case "snow":
        fmt.Println("Remember to wear a scarf today.🧣")
    case "rainy":
        fmt.Println("Remember to bring an umbrella today.🌂")
    default:
        fmt.Println("Today is sunny.☀")
    }
}

运行代码:

go run switch.go

输出如下:

Remember to bring an umbrella today.🌂

这个天气预报程序会根据不同的天气状况输出不同的结果。首先,我们将今日天气设置为 "rainy"。在下方的 switch-case 分支中,我们设置了三个不同的条件:下雪时提醒你戴围巾,下雨时提醒你带伞,否则一律视为晴天。

分支中的多值匹配

case 语句也可以包含多个值,如下所示:

switch condition {
    case val1, val2:
        // 代码块
    ...
}

我们将天气程序更新如下:

package main

import (
    "fmt"
)

func main() {
    // 今日天气
    weather := "snow"
    switch weather {
    case "snow", "stormy":
        fmt.Println("Remember to wear a scarf today.🧣")
    case "haze", "sandstorm":
        fmt.Println("Remember to wear a mask today.😷")
    case "rainy":
        fmt.Println("Remember to bring an umbrella today.🌂")
    default:
        fmt.Println("Today is sunny.☀")
    }
}
go run switch.go

运行代码后,输出如下:

Remember to wear a scarf today.🧣

我们增加了一些天气条件。现在当出现雾霾或沙尘暴时,程序会提醒我们需要佩戴口罩。

无条件变量的 switch 语句

switch 语句中的条件变量是一个可选参数。当省略条件变量时,switch 语句的行为与 if-else 语句非常相似。

我们使用不带条件变量的 switch 语句重写了上一节中输出今天星期几的程序:

package main

import (
    "fmt"
    "time"
)

func main() {
    today := time.Now().Weekday()
    switch {
    case today == time.Monday:
        fmt.Println("Today is Monday.")
    case today == time.Tuesday:
        fmt.Println("Today is Tuesday.")
    case today == time.Wednesday:
        fmt.Println("Today is Wednesday.")
    case today == time.Thursday:
        fmt.Println("Today is Thursday.")
    case today == time.Friday:
        fmt.Println("Today is Friday.")
    case today == time.Saturday:
        fmt.Println("Today is Saturday.")
    default:
        fmt.Println("Today is Sunday.")
    }
}
go run switch.go

运行代码后,输出如下:

Today is Monday.

在这个程序中,switch 语句中移除了条件变量。程序执行时,会检查每个 case 分支中的条件是否满足。当某个 case 条件成立时,该分支的代码将被执行,最后程序退出 switch 代码块。

fallthrough 语句

如前所述,程序在执行完一个 case 分支后,会自动退出当前的 switch 分支。

如果你希望在执行完一个 case 分支后继续执行下一个分支语句,可以使用 fallthrough 语句。

以下是使用 fallthrough 语句的规范:

  • 默认情况下,switch 语句在匹配并执行 case 10 后,不会继续执行后续分支。而 fallthrough 语句会强制执行紧接着的下一个 case 分支。
  • fallthrough 只影响下一个 case 语句,并且不会对该 case 进行条件检查。
  • fallthrough 不能在 switch 的最后一个分支中使用。

让我们看一个具体的例子:

package main

import (
    "fmt"
)

func main() {
    n := 10
    switch n {
    case 10:
        fmt.Println(10)
        fallthrough
    case 3:
        fmt.Println(3)
    }
}
go run switch.go

运行代码后,输出如下:

10
3

在匹配到 case 10 语句后,switch 分支输出了 10,然后由于 fallthrough 的存在,它接着输出了下一个 case 语句的内容。

switch 中的初始化语句

在 Go 中,不仅 if 分支语句拥有初始化语句,switch 分支语句也同样支持。你可以在条件变量之前编写初始化语句,并用分号隔开。

挑战

现在,你需要重写上一节的程序,将初始化语句移动到 switch 语句中。

创建一个名为 switch2.go 的新文件。将以下代码写入 switch2.go 文件中。修改上一节的程序,将初始化语句移动到 switch 语句内部。

cd ~/project
touch switch2.go

上一节的代码如下:

package main

import (
    "fmt"
)

func main() {
    n := 10
    switch n {
    case 10:
        fmt.Println(1)
        fallthrough
    case 3:
        fmt.Println(3)
    }
}

要求:

  • switch2.go 文件应放置在 ~/project 目录下。

提示: 你可以参考 if-else 实验中的初始化程序部分来进行修改。

✨ 查看解决方案并练习

总结

在本实验中,我们讲解了 switch 分支语句。关键点如下:

  • case 语句匹配并执行后,程序会自动退出当前的 switch 代码块。
  • 你可以使用 fallthrough 关键字来继续执行下一个 case 语句。
  • switch 也支持初始化语句,通过分号与条件表达式分隔。