# **程序流程控制**
在程序中,程序運行的流程控制決定程序是如何執行的,是我們必須掌握的,主要有三大流程控
制語句。
1) 順序控制
2) 分支控制
3) 循環控制
#### **順序控制**
程序從上到下逐行地執行,中間沒有任何判斷和跳轉。 一個案例說明,必須下面的代碼中,沒有判斷,也沒有跳轉.因此程序按照默認的流程執行,即順 序控制。
分支控制就是讓程序有選擇執行。有下面三種形
**(if后面沒有()當然不推薦使用寫了也不會報錯,else不能和前后的大括號在不同行會報錯)**
1) 單分支

2) 雙分支

3) 多分支

**注意在go中條件語句中不能有賦值語句其他語言可以(例如 php)但是go中會編譯錯誤**
**if語句前面可以有一個語句例如**
```
if err := recover; err != nil {
fmt.Println("錯誤處理", err)
}
```
## **switch 分支控制**
1) switch 的執行的流程是,先執行表達式,得到值,然后和 case 的表達式進行比較,如果相等, 就匹配到,然后執行對應的 case 的語句塊,然后退出 switch 控制。
2) 如果 switch 的表達式的值沒有和任何的 case 的表達式匹配成功,則執行 default 的語句塊。執行尚硅谷 Go 語言課程 后退出 switch 的控制.
3) golang 的 case 后的表達式可以有多個,使用 逗號 間隔.
4) golang 中的 case 語句塊不需要寫 break , 因為默認會有,即在默認情況下,當程序執行完 case 語 句塊后,就直接退出該 switch 控制結構。

注意事項:
1) case/switch 后是一個表達式( 即:常量值、變量、一個有返回值的函數等都可以)
2) case 后的各個表達式的值的數據類型,必須和 switch 的表達式數據類型一致
3) case 后面可以帶多個表達式,使用逗號間隔。比如 case 表達式 1, 表達式 2 ...
4) case 后面的表達式如果是常量值(字面量),則要求不能重復
5) case 后面不需要帶 break , 程序匹配到一個 case 后就會執行對應的代碼塊,然后退出 switch,如 果一個都匹配不到,則執行 defaul
6) default 語句不是必須的.
7) switch 后也可以不帶表達式,類似 if --else 分支來使用。
8) switch 后也可以直接聲明/定義一個變量,分號結束,不推薦。
9) switch 穿透\-fallthrough ,如果在 case 語句塊后增加 fallthrough ,則會繼續執行下一個 case,也 叫 switch 穿透
10) Type Switch:switch 語句還可以被用于 type-switch 來判斷某個 interface 變量中實際指向的 變量類型
#### **switch 和 if 的比較**
總結了什么情況下使用 switch ,什么情況下使用 if
1) 如果判斷的具體數值不多,而且符合整數、浮點數、字符、字符串這幾種類型。建議使用 swtich 語句,簡潔高效。
2) 其他情況:對區間判斷和結果為 bool 類型的判斷,使用 if,if 的使用范圍更廣。
## **for 循環控制**
```
for 循環變量初始化; 循環條件; 循環變量迭代 {
循環操作(語句)
}
```
對上面的語法格式說明
1) 對 for 循環來說,有四個要素:
2) 循環變量初始化
3) 循環條件
4) 循環操作(語句) ,有人也叫循環體。
5) 循環變量迭代
for 循環執行的順序說明:
1) 執行循環變量初始化,比如 i := 1
2) 執行循環條件, 比如 i <= 10
3) 如果循環條件為真,就執行循環操作 :比如 fmt.Println(“....”)
4) 執行循環變量迭代 , 比如 i++
5) 反復執行 2, 3, 4 步驟,直到 循環條件為 False ,就退出 for 循環。
#### **for 循環的使用注意事項和細節討論**


for 的三個值我們可以每個去掉進行進一步嘗試
#### **字符串遍歷方式 **
1-傳統方式

2字符串遍歷方式 2-for - range

如果我們的字符串含有中文,那么傳統的遍歷字符串方式,就是錯誤,會出現亂碼。原因是傳統的 對字符串的遍歷是按照字節來遍歷,而一個漢字在 utf8 編碼是對應 3 個字節。
如何解決 需要要將 str 轉成 \[\]rune 切片.=> 體驗一把

對應 for-range 遍歷方式而言,是按照字符方式遍歷。因此如果有字符串有中文,也是 ok

#### **while 和 do...while的實現**
Go 語言沒有 while 和 do...while 語法,這一點需要同學們注意一下,如果我們需要使用類似其它語 言(比如 java / c 的 while 和 do...while ),可以通過 for 循環來實現其使用效果。
#### **while 循環的實現**

1) for 循環是一個無限循環
2) break 語句就是跳出 for 循環

#### **do..while 的實現**

1) 上面的循環是先執行,在判斷,因此至少執行一次。
2) 當循環條件成立后,就會執行 break, break 就是跳出 for 循環,結束循環.

#### **跳轉控制語句-break**
break 語句用于終止某個語句塊的執行,用于中斷當前 for 循環或跳出 switch 語句
1) break 語句出現在多層嵌套的語句塊中時,可以通過標簽指明要終止的是哪一層語句塊

(2) break 默認會跳出最近的 for 循環
(3) break 后面可以指定標簽,跳出標簽對應的 for 循環
#### **跳轉控制語句-continue**
continue 語句用于結束本次循環,繼續執行下一次循環。
continue 語句出現在多層嵌套的循環語句體中時,可以通過標簽指明要跳過的是哪一層循環 , 這個和前面的 break 標簽的使用的規則一樣.

#### **跳轉控制語句-goto**
1) Go 語言的 goto 語句可以無條件地轉移到程序中指定的行。
2) goto 語句通常與條件語句配合使用。可用來實現條件轉移,跳出循環體等功能。
3) 在 Go 程序設計中一般不主張使用 goto 語句, 以免造成程序流程的混亂,使理解和調試程序 都產生困難

#### **跳轉控制語句-return**
return 使用在方法或者函數中,表示跳出所在的方法或函數
1) 如果 return 是在普通的函數,則表示跳出該函數,即不再執行函數中 return 后面代碼,也可以 理解成終止函數。
2) 如果 return 是在 main 函數,表示終止 main 函數,也就是說終止程序。