介绍
在之前的实验中,我们学习了 if-else 分支语句的用法。在本实验中,我们将学习 switch-case 分支语句。与 if-else 语句相比,switch 语句更适合处理多条件的场景。
知识点:
- switch-case 语句
- default 关键字
- fallthrough 关键字
在之前的实验中,我们学习了 if-else 分支语句的用法。在本实验中,我们将学习 switch-case 分支语句。与 if-else 语句相比,switch 语句更适合处理多条件的场景。
知识点:
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 语句的行为与 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 代码块。
如前所述,程序在执行完一个 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 语句的内容。
在 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 也支持初始化语句,通过分号与条件表达式分隔。