介绍
在之前的实验中,我们学习了 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
可以是任何类型的表达式。当 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
语句的行为将类似于 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
switch
分支在匹配到 case 10
语句后输出 10
,然后由于 fallthrough
的作用,继续输出下一个 case
语句的 3
。
在 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
也可以有初始化语句,与条件表达式之间用分号分隔。