|
@@ -628,15 +628,82 @@ import time "time" // <=> import "time"
|
|
|
2. for 循环代码块
|
|
|
3. switch-case 多条件分支代码块
|
|
|
|
|
|
+**特殊流程控制代码块**
|
|
|
|
|
|
+1. 容器类型相关的 for-range 循环代码块
|
|
|
+2. 接口类型相关的 type-switch 多条件分支代码块
|
|
|
+3. 通道类型相关的 select-case 多分支代码块
|
|
|
|
|
|
+### if-else
|
|
|
|
|
|
+一个if-else条件分支控制代码块的完整形式如下:
|
|
|
|
|
|
+```go
|
|
|
+1| if InitSimpleStatement; Condition {
|
|
|
+2| // do something
|
|
|
+3| } else {
|
|
|
+4| // do something
|
|
|
+5| }
|
|
|
+
|
|
|
+12| if n := rand.Int(); n%2 == 0 {
|
|
|
+13| fmt.Println(n, "是一个偶数。")
|
|
|
+14| } else {
|
|
|
+15| fmt.Println(n, "是一个奇数。")
|
|
|
+16| }
|
|
|
+
|
|
|
+```
|
|
|
+
|
|
|
+InitSimpleStatement 是初始化部分,可忽略,如果有初始化,变量域只包括当前if-else代码块中
|
|
|
+
|
|
|
+### for
|
|
|
+
|
|
|
+for循环代码块的完整形式如下:
|
|
|
+
|
|
|
+```go
|
|
|
+1| for InitSimpleStatement; Condition; PostSimpleStatement {
|
|
|
+2| // do something
|
|
|
+3| }
|
|
|
|
|
|
+1| for i := 0; i < 10; i++ {
|
|
|
+2| fmt.Println(i)
|
|
|
+3| }
|
|
|
+```
|
|
|
|
|
|
+for 循环 如果条件表达式部分被省略,则编译器视其为true。
|
|
|
|
|
|
+```go
|
|
|
+1| for i := 0; ; i++ { // 等价于:for i := 0; true; i++ {
|
|
|
+2| if i >= 10 {
|
|
|
+3| break
|
|
|
+4| }
|
|
|
+5| fmt.Println(i)
|
|
|
+6| }
|
|
|
+7|
|
|
|
+8| // 下面这几个循环是等价的。
|
|
|
+9| for ; true; {
|
|
|
+10| }
|
|
|
+11| for true {
|
|
|
+12| }
|
|
|
+13| for ; ; {
|
|
|
+14| }
|
|
|
+15| for {
|
|
|
+16| }
|
|
|
+```
|
|
|
+
|
|
|
+循环体内声明的同名变量,是新变量。
|
|
|
|
|
|
+```go
|
|
|
+1| for i := 0; i < 3; i++ {
|
|
|
+2| fmt.Print(i)
|
|
|
+3| i := i // 这里声明的变量i遮挡了上面声明的i。
|
|
|
+4| // 右边的i为上面声明的循环变量i。
|
|
|
+5| i = 10 // 新声明的i被更改了。
|
|
|
+6| _ = i
|
|
|
+7| }
|
|
|
+//输出:012
|
|
|
+```
|
|
|
|
|
|
+# 协程、延迟函数调用、恐慌和恢复
|
|
|
|
|
|
|
|
|
|