Golang 中的 Switch-Case 分支语句

GolangGolangBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

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

知识点:

  • switch-case 语句
  • default 关键字
  • fallthrough 关键字

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("`Golang`")) -.-> go/BasicsGroup(["`Basics`"]) go(("`Golang`")) -.-> go/FunctionsandControlFlowGroup(["`Functions and Control Flow`"]) go(("`Golang`")) -.-> go/AdvancedTopicsGroup(["`Advanced Topics`"]) go/BasicsGroup -.-> go/variables("`Variables`") go/FunctionsandControlFlowGroup -.-> go/if_else("`If Else`") go/FunctionsandControlFlowGroup -.-> go/switch("`Switch`") go/AdvancedTopicsGroup -.-> go/time("`Time`") subgraph Lab Skills go/variables -.-> lab-149072{{"`Golang 中的 Switch-Case 分支语句`"}} go/if_else -.-> lab-149072{{"`Golang 中的 Switch-Case 分支语句`"}} go/switch -.-> lab-149072{{"`Golang 中的 Switch-Case 分支语句`"}} go/time -.-> lab-149072{{"`Golang 中的 Switch-Case 分支语句`"}} end

基本语法

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

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

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

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

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

default 语句类似于 else 语句。当没有其他 case 语句与 condition 匹配时,将执行 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

switch 分支在匹配到 case 10 语句后输出 10,然后由于 fallthrough 的作用,继续输出下一个 case 语句的 3

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 也可以有初始化语句,与条件表达式之间用分号分隔。

您可能感兴趣的其他 Golang 教程