09-GoLang流程控制
選擇結構if
-
C語言中有三目運算子 ?:
-
Go語言中沒有,所有用三目解決的問題使用 if-else 來解決
-
C語言中的if選擇結構有三種格式
格式一:
if(條件表示式){
被控制的語句;
}
格式二:
if(條件表示式){
被控制的語句;
}else{
被控制的語句;
}
格式三:
if(條件表示式){
被控制的語句;
}else if(條件表示式){
被控制的語句;
}else{
被控制的語句;
}
-
Go語言中的if選擇結構也有三種格式, 並且和C語言中的格式類似
格式一:
if 初始化表示式;條件表示式 {
被控制的語句;
}
// 注意點: 如果將變數定義到if的初始化表示式中, 那麼變數只能在if結構中使用 // 這樣做的目的是為了提升效能, 如果變數只在選擇結構中使用, //那麼建議定義到初始化表示式中, 這樣只要選擇結構結束了, 那麼變數就釋放了 if age := 19; age >=18 { fmt.Println("開網絡卡") } fmt.Println("買飲料") fmt.Println(age) // 報錯 //若要繼續使用變數,則定義到if結構外面 // age := 17 //if age >=18 { // fmt.Println("開網絡卡") }
格式二:
if 初始化表示式;條件表示式 {
被控制的語句;
}else{
被控制的語句;
}
// 注意點: 在if初始化表示式中定義的變數, 是在整個if選擇結構中都可以使用的, // 不僅僅只是在if{}中可以使用, 在else{}中也可以使用 if age := 17;age >= 18 { fmt.Println("開網絡卡") }else{ fmt.Println("回家叫家長") fmt.Println(age) } fmt.Println("買飲料")
格式三:
if 初始化表示式;條件表示式{
被控制的語句;
}else if 初始化表示式;條件表示式{
被控制的語句;
}else{
被控制的語句;
}
// 注意點: // 1.不僅僅if後面可以寫初始化表示式, 所有的elseif後面也可以寫初始化表示式 // if後面的初始化表示式在整個選擇結構中都可以使用 // elseif後面的初始化後表示式, 只能在當前的elseif和後續的elseif/else中使用, 不能在初始化表示式定義之前使用 // 2.如果if初始化表示式定義的變數和elseif初始化表示式定義的變數同名了, 那麼會出現覆蓋現象(重新定義了變數) age := 3 fmt.Println(&age) if age:=15; age >= 22 { fmt.Println("該上班了") fmt.Println(age) }else if fmt.Println(&age); age >= 18{ fmt.Println("該上大學了") fmt.Println(age) }else if age := 666; age >= 12{ fmt.Println("該上中學了") fmt.Println(age) // 這裡訪問的是當前elseif定義的age fmt.Println(&age) }else{ fmt.Println("該幹嘛幹嘛") fmt.Println(age) } fmt.Println(&age) fmt.Println("other")
-
C語言中if選擇結構的特點:
1、條件表示式非零即真
2、if後面的{}可以省略
3、如果省略大括號, 不能定義行的變數
-
Go語言if選擇結構的特點:
1、條件表示式必須是返回布林型別的值, 沒有非零即真的概念
2、if後面的{}不能省略
3、可以在條件表示式前面新增初始化表示式
4、每個條件表示式的前面都可以新增初始化表示式
5、多個初始化表示式定義了同名的變數, 訪問時採用就近原則(會重新定義變數,地址不同)
選擇結構switch
-
C語言中的switch結構
switch(值){
case 值:
被控制語句;
break;
case 值:
被控制語句;
break;
default:
被控制語句;
break;
}
-
Go語言中的Switch結構和C語言類似
switch 初始化表示式; 值{
case 值:
被控制語句;
case 值:
被控制語句;
default:
被控制語句;
}
//age := 22 //switch age { //case 22: //fmt.Println("該上班了") //case 18: //fmt.Println("該上大學了") //default: //fmt.Println("該幹嘛幹嘛") //} switch age := 3; age { case 22: fmt.Println("該上班了") case 18: fmt.Println("該上大學了") default: fmt.Println("該幹嘛幹嘛") }
-
注意點:
1.和C語言不一樣, Go語言的switch可以傳遞小數
switch num := 18.0; num { // 傳遞一個小數 case 22: fmt.Println("該上班了") case 18: fmt.Println("該上大學了") default: fmt.Println("該幹嘛幹嘛") }
2.和C語言不一樣, Go語言switch中還可以新增初始化表示式
3.和C語言不一樣, Go語言不用編寫break語句, 預設就不會穿透
4.在Go語言中, 如果想要穿透, 必須手動新增一個fallthrough
switch num := 18.0; num { // 傳遞一個小數 case 22: fmt.Println("該上班了") case 18: fmt.Println("該上大學了") fallthrough // 告訴系統需要穿透 default: fmt.Println("該幹嘛幹嘛") }
5.Go語言中的switch可以當做if來使用(可以寫表示式)
switch num := 50;{//將判斷放到case語句裡面了 case num >=0 && num <=50: value := 666 fmt.Println("0~50之間的數") fmt.Println(value) case num >50 && num <=100: fmt.Println("51~100之間的數") default: fmt.Println("其它區間") }
6.default可以不寫, 也可以寫到其它位置, 無論寫到哪都會最後判斷執行
7.case後面定義變數不用新增大括號{}
迴圈結構
- 在C語言中迴圈結構有三個 for/while/dowhile
- 在Go語言中迴圈結構只有一個 for
因為while/dowhile能做的for都能做, 所以Go只保留了for迴圈 - C語言for迴圈的格式
for(初始化表示式;條件表示式;增量表達式){
需要迴圈操作的語句;
} - Go語言的for迴圈和C語言非常非常非常像
for 初始化表示式;條件表示式;增量表達式{
需要迴圈操作的語句;
}for num := 0; num < 5; num++{ fmt.Println("發射小星星") }
- 特點:
1.沒有非零即真的概念, 條件表示式的返回值必須是布林型別
2.不能省略大括號
3.最簡單的死迴圈
for{}
跳轉
break
- 在C語言中有四大跳轉語句 break continue goto return
- 在Go語言中也有四大跳轉語句 break continue goto return
- 在C語言中break的應用範圍:switch語句和迴圈語句
- 在Go語言中一樣是:switch語句和迴圈語句(但是Go語言的switch語句中預設就不會穿透, 所以break寫不寫都行, 一般都不寫)
switch num := 2; num { case 1: fmt.Println("1") case 2: fmt.Println("2") break//一般不寫 default: fmt.Println("OTHER") } for num := 1; num <= 10; num++ { fmt.Println(num) if num == 5{ break } }
- 注意點:Go語言中的break可以跳轉到指定的標籤, 但是標籤只能定義在前面, 並且跳轉到標籤之後迴圈不會被再次執行,標籤和迴圈之間不能編寫其它語句
lyw: //fmt.Println("start") // 標籤和迴圈之間不能新增任何語句 for num := 1; num <= 10; num++ { fmt.Println(num) if num == 5{ break lyw } } //lyw: // 標籤只能寫在前面 fmt.Println("end")
continue
- 在C語言中continue只能用於迴圈結構
- 在Go語言中和C語言一樣, 也只能用於迴圈結構
- 使用的各種特性和C語言都一樣, 唯一不一樣的就是可以跳轉到指定的標籤
LNJ: for num := 1; num <= 10; num++ { if (num % 2) == 0{ continue LNJ } fmt.Println(num) }
-
注意點:
- 如果跳轉到指定的標籤, 對於單層迴圈來說沒有任何意義, 和不指定標籤的效果一樣
for num := 1; num <= 10; num++ { if (num % 2) == 0{ continue } fmt.Println(num)
}
```
- 如果跳轉到指定的標籤, 對於多層迴圈來說才有意義, 結束當前內迴圈, 跳到下一次外迴圈
LNJ: for i:=1; i<=5;i++{ fmt.Println(i) for j:=1; j <=10; j++{ if (j % 2) == 0{ continue LNJ } fmt.Println("---------", j) }
}
```
- 其它的注意點和break跳轉到標籤一樣
- 標籤只能定義在前面, 標籤和迴圈之間不能新增其它語句
- 如果跳轉到指定的標籤, 對於單層迴圈來說沒有任何意義, 和不指定標籤的效果一樣
goto
- C語言中的goto可以在同一個函式中隨便亂跳
- Go語言中的goto也可以在同一個函式中隨便亂跳
- 注意點:
- 可以往前跳, 也可以往後跳
- 標籤和跳轉語句之間可以編寫其它的程式碼
num := 1 outer: fmt.Println("start") if(num <= 10){ fmt.Println(num) num++ goto outer } fmt.Println("come here") for i:=1; i <= 10; i++{ fmt.Println(i) if i == 5{ goto LYW } } LYW: fmt.Println("come here")
return
略