【go語言學習】流程控制
流程控制是每種程式語言控制邏輯走向和執行次序的重要部分,流程控制可以說是一門語言的“經脈”。
程式的流程控制結構一共有三種:順序結構,選擇結構,迴圈結構。
- 順序結構:從上向下,逐行執行。
- 選擇結構:條件滿足,某些程式碼才會執行。0-1次
分支語句:if,switch,select,goto - 迴圈結構:條件滿足,某些程式碼會被反覆的執行多次。0-N次
迴圈語句:for
一、條件語句
1、if語句
語法格式
if 布林表示式 {
執行程式碼塊
}
if 布林表示式 {
執行程式碼塊
} else {
執行程式碼塊
}
if 布林表示式 { 執行程式碼塊 } else if 布林表示式 { 執行程式碼塊 } else { 執行程式碼塊 }
if語句的特殊寫法
if 執行語句;布林表示式 {
執行程式碼塊
}
2、switch語句
switch是一個條件語句。
switch v {
case v1:
執行程式碼塊
case v2:
執行程式碼塊
default:
執行程式碼塊
}
switch 語句用於基於不同條件執行不同動作。
每一個 case 分支都是唯一的,從上到下逐一測試,直到匹配為止。
匹配成功後不會向下執行其他case分支,而是跳出整個switch。
go語言中每一個匹配項後面不需要再加break。
default語句可有可無,但是最多隻能有一個。
使用fallthrough
n := 10
switch n {
case 10:
fmt.Println(10)
fallthrough
case 20:
fmt.Println(20)
case 30:
fmt.Println(30)
default:
fmt.Println("啥也不是")
}
執行結果
10
20
如果switch沒有表示式,它會匹配true。
score := 95 switch { case score >= 90: fmt.Println("優秀") case score >= 80 && score < 90: fmt.Println("優良") case score >= 70 && score < 80: fmt.Println("良好") case score >= 60 && score < 70: fmt.Println("及格") default: fmt.Println("不及格!") }
執行結果
優秀
一個case後面可以新增多個條件,以逗號分開。
month := 8
switch month {
case 1, 3, 5, 7, 8, 10, 12:
fmt.Println("31天")
case 4, 6, 9, 11:
fmt.Println("30天")
case 2:
fmt.Println("我也不知道啊")
default:
fmt.Println("沒有的事兒~")
}
執行結果
31天
二、迴圈語句
1、for語句
所有的迴圈均可以通過for語句完成。
for 表示式1(迴圈變數初始化); 表示式2(判斷條件); 表示式3(更新迴圈變數) {
迴圈體語句
}
for i := 0; i < 10; i++ {
fmt.Printf("%v\t", i)
}
執行結果
0 1 2 3 4 5 6 7 8 9
for迴圈變體
for的表示式1、表示式2、表示式3三個均是可選的。
for迴圈的迴圈變數初始化可以被忽略,但是迴圈變數初始化語句後的分號必須要寫,例如:
i := 0
for ; i < 10; i++ {
fmt.Printf("%v\t", i)
}
for迴圈的迴圈變數初始化語句和更新迴圈變數語句都可以省略,例如:
i := 0
for i < 10 {
fmt.Printf("%v\t", i)
i++
}
三個都省略,無限迴圈:
i := 0
for {
fmt.Printf("%v\t", i)
i++
if i == 10 {
break
}
}
for range
Go語言中可以使用for range遍歷陣列、切片、字串、map 及通道(channel)。 通過for range遍歷的返回值有以下規律:
- 陣列、切片、字串返回索引和值。
- map返回鍵和值。
- 通道(channel)只返回通道內的值。
s := "hello 世界"
for k, v := range s {
fmt.Printf("%v-%v\n", k, v)
}
執行結果
0-h
1-e
2-l
3-l
4-o
5-
6-世
9-界
2、break語句
break:跳出迴圈體。break語句用於在結束其正常執行之前突然終止for迴圈。
for i := 0; i < 10; i++ {
fmt.Printf("%v\t", i)
if i == 5 {
break
}
}
執行結果
0 1 2 3 4 5
3、continue語句
continue語句可以結束當前迴圈,開始下一次的迴圈迭代過程,僅限在for迴圈內使用。
在 continue語句後新增標籤時,表示開始標籤對應的迴圈。
label :
for i := 0; i < 3; i++ {
for j := 0; j < 5; j++ {
fmt.Printf("i = %v\tj = %v\n", i, j)
if j == 2 {
continue label
}
}
}
執行結果
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
三、goto語句
goto:可以無條件地轉移到過程中指定的行。
for i := 0; i < 5; i++ {
fmt.Println(i)
if i == 3 {
goto breakTag
}
}
breakTag:
fmt.Println("迴圈結束")
執行結果
0
1
2
3
迴圈結束
注意事項
break、goto、return、panic語句都可以強制退出迴圈。但需要注意:
- break是結束當前迴圈
- goto結束整個迴圈,轉移至指定行執行,只執行tag標籤後面的語句
- return結束整個函式,其後的語句都不再執行
- panic結束整個程式,其後的語句都不再執行
package main
import "fmt"
func main() {
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
fmt.Println(i, j)
if j == 1 {
break
}
}
}
fmt.Println("hello")
}
執行結果
0 0
0 1
1 0
1 1
hello
package main
import "fmt"
func main() {
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
fmt.Println(i, j)
if j == 1 {
goto breakTag
}
}
}
fmt.Println("hello")
breakTag:
fmt.Println("迴圈結束")
}
執行結果
0 0
0 1
迴圈結束
package main
import "fmt"
func main() {
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
fmt.Println(i, j)
if j == 1 {
return
}
}
}
fmt.Println("hello")
}
執行結果
0 0
0 1
package main
import "fmt"
func main() {
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
fmt.Println(i, j)
if j == 1 {
panic("系統崩潰了")
}
}
}
fmt.Println("hello")
}
執行結果
0 0
0 1
panic: 系統崩潰了
goroutine 1 [running]:
main.main()
E:/golang/go_project/main.go:10 +0x191
exit status 2