Go从入门到精通——控制流程
控制流程
本章介绍如下内容:
- 使用 if、else 和 else if 语句。
- 使用比较运算符
- 使用算术运算符
- 使用逻辑运算符
- 使用 switch 语句
- 使用 for 语句执行循环
- 使用 defer 语句
本章介绍控制流程以及代码执行流程是如何确定的,让你能够创建以不同的方式响应数据的程序。
1.1 使用 if 语句
if 语句是计算机程序的重要组成部分,几乎所有编程语言都支持。简单地说,if 语句检查指定条件,并在条件满足时执行指定的操作。"如果……就" 范式让程序能够以不同的方式响应数据,还让程序员能够实现在不同条件下采取不同措施的逻辑。无论是在命令行程序还是现代计算机游戏中,都有默默无闻的 if 语句的身影,它支撑着或复杂或简单的逻辑树。
package main import ( "fmt" ) func main() { b := true if b { fmt.Println("b is true") } }
- 声明变量 b 并将其初始化为 true。这个变量被推断为布尔类型。
- 使用一条 if 语句判断 b 是否为 true。
- 由于这条 if 语句的结果为 true,因此执行大括号内的代码。
- 打印一行文本,文本内容为 “b is true”
如果将 b 的值改为 false,则这条 if 语句的结果将为 false,因此不会执行大括号内的代码。
package main import "fmt" func main() { b := false if b { fmt.Println("b is true!") } }
if 语句总是计算一个布尔表达式,在它为 true 时执行大括号内的代码,在它为 false 时不执行。简单 if 语句是一种强大的范式,仅使用它们就能创建出复杂的程序。
1.2 使用 else 语句
else 语句指定了到达该分支时将执行的代码。它不做任何判断,只要到达它所在的分支就执行。只要前面有语句的结果为 true,else 语句就不会执行。在 Go 语言中,else 语句紧跟在其他语句的大括号后面,通常是当前块中的最后一条语句。大致而言,else 相当于说,如果其他条件不为 true,就执行这条语句。
package main import "fmt" func main() { b := false if b { fmt.Println("b is true") } else { fmt.Println("b is false") } }
1.3 使用 else if 语句
在很多情况下,都需要依次判断多个布尔表达式,此时可使用 else if 语句。else if 语句能够让您在前面的布尔表达式为 false 时接着判断后面的布尔表达式,这种逻辑的意思是,如果前面的 if 或 else if 语句为 false,就试试这条 else if 语句。else if 语句紧跟在前面的 if 或 else if 语句的右大括号后面,且包含另一个布尔表达式。可依次使用多条 else if 语句。
package main import ( "fmt" ) func main() { i := 3 if i == 3 { fmt.Println("i is 3") } else if i == 2 { fmt.Println("i is 2") } }
- 声明变量 i 并将其初始化为2。
- 第一条 if 语句判断 i 是否为3。如果不是,就忽略下一行代码。
- else if 语句使用另一个布尔表达式判断 i 是否为 2。
- 由于 i 为2,因此执行下一行代码,打印文本 i is 2
1.4 使用比较运算符
布尔表达式只是返回 true 或 false,但使用比较运算符可执行更复杂的评估。比较运算符可用于任何两项类型相同的数据进行比较,如果它们满足比较运算符指定的条件,结果为 true,否则为 false。
- 两个字符串是否相同?
- 两个数字是否相同?
- 一个数字是否比另一个数字大?
- 一个数字是否小于等于另一个数字?
- 列出了 Go 语言支持的所有比较运算符。
字符 | 运算符 |
== | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
1.5 使用算术运算符
在任何对布尔表达式进行评估的语句中,都可使用基本算术运算来改进逻辑和评估。常结合使用算术运算符和比较运算符来创建管理控制流程的布尔表达式。
-
- 两个数的和是否等于特定的数字?
- 两个数的差是否大于特定的数字?
- 两个数的商是否等于特定的数字?
字符 | 运算符 |
+ | 和(也叫加) |
- | 差(也叫减) |
* | 积(也叫乘) |
/ | 商(也叫除) |
% | 余(也叫模) |
与比较运算符一样,算术运算符也只能用于类型相同的操作数。
1.6 使用逻辑运算符
除比较运算符和算术运算符外,逻辑运算符也可用于支持控制流程。逻辑运算符支持 3 种比较。
字符 | 运算符 |
&& | 与:连个条件是否都为 true |
|| | 或:两个条件是否至少有一个为 true |
! | 非:条件是否为 false |
1.7 使用 switch 语句
switch 语句可用来替代冗长的 if else 布尔比较。出于对代码可读性的考虑,很多程序员都喜欢使用 switch 语句(而不使用 if else 语句),从编译层面上说,这样的代码效率也可能更高。除少量的 if else 比较外,其他的都可替换为 switch 语句,这样不仅可提高代码的可读性,还可提高性能。
package main import "fmt" func main() { i := 2 switch i { case 2: fmt.Println("Two") case 3: fmt.Println("Three") case 4: fmt.Println("Four") } }
- switch 语句指定了一个要评估的变量——i;
- 在一系列 case 语句中指定了要与变量 i 比较的表达式;
- 如果这个表达式的结果与 i 相等,就执行响应的语句;
- 如果这个表达式的结果与i 不等,就跳到下一条 case 语句;
- 在这里,由于 i 为 2,所以打印 "Two"。
package main import "fmt" func main() { s := "c" switch s { case "a": fmt.Println("The letter a!") case "b": fmt.Println("The letter b!") default: fmt.Println("I don't recognize that letter!") } }
1.8 使用 for 语句进行循环
for 语句让您能够反复执行代码块,这在编程中被称为循环:反复执行代码块,直到条件不再满足。
package main import "fmt" func main() { i := 0 for i < 10 { i++ fmt.Println("i is", i) } }
- 声明变量 i 并将其初始化为 0;
- 一条 for 语句判断 i 是否小于 10;
- 如果这个布尔条件为 true,就执行 for 语句中的代码;
- 使用递增运算符将变量 i 加 1。
1.8.1 包含初始化语句和后续语句的 for 语句
除要检查的条件外,for 语句还可指定在循环开始时执行的初始化语句以及后续(post)语句。这些语句可让迭代代码简短得多,但必须使用分号将它们分隔开。
- 初始化语句:仅在首次迭代前执行。
- 条件语句:每次迭代前都将检查的布尔表达式。
- 后续语句:每次迭代后都将执行。
程序清单:一个包含初始化语句和后续语句的 for 语句
package main import "fmt" func main() { for i := 0; i < 10; i++ { fmt.Println("i is", i) } }
- 声明变量 i,并将其初始化为 0;
- 一条 for 语句检查变量 i 是否小于 10;
- 如果这个布尔表达式为 true,就执行 for 语句中的代码;
- 使用递增运算符将要变量 i 的值加 1;
- 打印 "i is", i;
- 返回到开头的布尔表达式,判断变量 i 的值是否小于 10;
- 变量 i 不再小于 10 时,这个布尔表达式将为 false,因此跳出 for循环,不再执行 for 语句中的代码。
1.8.2 包含 range 子句的 for 语句
for 语句也可用来遍历数据结构。下面举个例子,创建了一个数组,用于存储一系列数字。数组简单地说,是用于存储一系列类型相同的数据。
package main import "fmt" func main() { numbers := []int{1, 2, 3, 4} for index, value := range numbers { fmt.Println("The index of the loop is ", index) fmt.Println("The value from the array is ", value) } }
1.9 使用 defer 语句
defer 是一个很有用的 Go 语言功能,它能够让你在函数返回前执行另一个函数。函数在遇到 return 语句或到达函数末尾时返回。defer 语句通常用于执行清理操作或确保操作(如网络调用)完成后再执行另一个函数。
package main import "fmt" func main() { defer fmt.Println("I am run after the function completes") fmt.Println("Hello World!") }
- 使用一条 defer 语句,在它所在的函数执行完毕后执行另一个函数;
- 打印 “Hello World!”,外部函数就此结束;
- 外部函数结束后,执行 defer 语句指定的函数。
程序清单:演示了多条 defer 语句及其执行顺序
package main import "fmt" func main() { defer fmt.Println("I am the first defer statement") defer fmt.Println("I am the second defer statement") defer fmt.Println("I am the third defer statement") fmt.Println("Hello World!") }
- 3 条 defer 语句都指定了它们所在的函数执行完毕后要执行的函数;
- 打印 "Hello World!"
- 外部函数执行完毕后,按与 defer 语句出现顺序相反的顺序执行它们指定的函数。