Co-authored-by: Joe Chen <jc@unknwon.io>
This commit is contained in:
Haigang Zhou
2022-05-09 21:42:14 +08:00
committed by GitHub
parent 82026084b3
commit f5dae8f559
16 changed files with 273 additions and 267 deletions

View File

@@ -1,6 +1,6 @@
# 5.3 switch 结构
相比较 C 和 Java 等其它语言而言Go 语言中的 switch 结构使用上更加灵活。它接受任意形式的表达式:
相比较 C 和 Java 等其它语言而言Go 语言中的 `switch` 结构使用上更加灵活。它接受任意形式的表达式:
```go
switch var1 {
@@ -13,13 +13,13 @@ switch var1 {
}
```
变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 `{` 必须和 switch 关键字在同一行。
变量 `var1` 可以是任何类型,而 `val1``val2` 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。前花括号 `{` 必须和 `switch` 关键字在同一行。
您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:`case val1, val2, val3`
每一个 `case` 分支都是唯一的,从上至下逐一测试,直到匹配为止。( Go 语言使用快速的查找算法来测试 switch 条件与 case 分支的匹配情况,直到算法匹配到某个 case 或者进入 default 条件为止。)
每一个 `case` 分支都是唯一的,从上至下逐一测试,直到匹配为止。( Go 语言使用快速的查找算法来测试 `switch` 条件与 `case` 分支的匹配情况,直到算法匹配到某个 `case` 或者进入 `default` 条件为止。)
一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 switch 代码块,也就是说您不需要特别使用 `break` 语句来表示结束。
一旦成功地匹配到某个分支,在执行完相应代码后就会退出整个 `switch` 代码块,也就是说您不需要特别使用 `break` 语句来表示结束。
因此,程序也不会自动地去执行下一个分支的代码。如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 `fallthrough` 关键字来达到目的。
@@ -45,9 +45,9 @@ switch i {
`case ...:` 语句之后,您不需要使用花括号将多行语句括起来,但您可以在分支中进行任意形式的编码。当代码块只有一行时,可以直接放置在 `case` 语句之后。
您同样可以使用 `return` 语句来提前结束代码块的执行。当您在 switch 语句块中使用 `return` 语句,并且您的函数是有返回值的,您还需要在 switch 之后添加相应的 `return` 语句以确保函数始终会返回。
您同样可以使用 `return` 语句来提前结束代码块的执行。当您在 `switch` 语句块中使用 `return` 语句,并且您的函数是有返回值的,您还需要在 switch 之后添加相应的 `return` 语句以确保函数始终会返回。
可选的 `default` 分支可以出现在任何顺序,但最好将它放在最后。它的作用类似与 `if-else` 语句中的 `else`,表示不符合任何已给出条件时,执行相关语句。
可选的 `default` 分支可以出现在任何顺序,但最好将它放在最后。它的作用类似与 if-else 语句中的 `else`,表示不符合任何已给出条件时,执行相关语句。
示例 5.4 [switch1.go](examples/chapter_5/switch1.go)
@@ -75,7 +75,7 @@ func main() {
It's equal to 100
在第 12.1 节,我们会使用 switch 语句判断从键盘输入的字符(详见第 12.2 节的 switch.goswitch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,该分支的代码会被执行。这看起来非常像链式的 `if-else` 语句,但是在测试条件非常多的情况下,提供了可读性更好的书写方式。
在第 12.1 节,我们会使用 `switch` 语句判断从键盘输入的字符(详见[第 12.2 节](12.2.md) 的 [switch.go](.\examples\chapter_12\switch.go))。`switch` 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 `true`),然后在每个 `case` 分支中进行测试不同的条件。当任一分支的测试结果为 `true` 时,该分支的代码会被执行。这看起来非常像链式的 if-else 语句,但是在测试条件非常多的情况下,提供了可读性更好的书写方式。
```go
switch {
@@ -101,7 +101,7 @@ switch {
}
```
任何支持进行相等判断的类型都可以作为测试表达式的条件,包括 intstring、指针等。
任何支持进行相等判断的类型都可以作为测试表达式的条件,包括 `int``string`、指针等。
示例 5.4 [switch2.go](examples/chapter_5/switch2.go)
@@ -154,7 +154,7 @@ switch result := calculate(); {
}
```
在下面这个代码片段中,变量 a 和 b 被平行初始化,然后作为判断条件:
在下面这个代码片段中,变量 `a``b` 被平行初始化,然后作为判断条件:
```go
switch a, b := x[i], y[j]; {
@@ -164,7 +164,7 @@ switch a, b := x[i], y[j]; {
}
```
switch 语句还可以被用于 type-switch详见第 11.4 节)来判断某个 interface 变量中实际存储的变量类型。
`switch` 语句还可以被用于 type-switch详见[第 11.4 节](11.4.md))来判断某个 `interface` 变量中实际存储的变量类型。
**问题 5.1**
@@ -195,7 +195,7 @@ switch 语句还可以被用于 type-switch详见第 11.4 节)来判断某
**练习 5.2** [season.go](exercises/chapter_5/season.go)
写一个 Season 函数,要求接受一个代表月份的数字,然后返回所代表月份所在季节的名称(不用考虑月份的日期)。
写一个 `Season()` 函数,要求接受一个代表月份的数字,然后返回所代表月份所在季节的名称(不用考虑月份的日期)。
## 链接