Go語言中的流程控制
流程控制主要用于設定計算執行的順序,簡歷程序的邏輯結果,Go語言的流程控制語句與其他語言類似,支持如下幾種流程控制語句:
-
條件語句:用于條件判斷,對應的關鍵字有if、else和else if;
-
分支語句:用于分支選擇,對應的關鍵字有switch、case和select(用于通道);
-
循環語句:用于循環迭代,對應的關鍵字有for和range;
-
跳轉語句:用于代碼跳轉,對應的關鍵字有goto。
1 條件語句
條件語句的示例模板:
// if
if condition { // do something
}
// if...else...
if condition { // do something
} else {// do something
}
// if...else if...else...
if condition1 { // do something
} else if condition2 {// do something else
} else {// catch-all or default
}
注意以下幾點:
-
條件語句不需要使用括號
()
將條件包含起來; -
無論語句體內有幾條語句,花括號
{}
都是必須存在的; -
左花括號
{
必須與 if 或者 else 處于同一行; -
在 if 之后,條件語句之前,可以添加變量初始化語句,使用
;
間隔,例如:if score := 100;score > 90 {
。
以下是一個簡單的條件語句代碼示例:
score := 100
if score > 85 {fmt.Println("優秀")
} else if score > 70 {fmt.Println("良好")
} else if score >= 60 {fmt.Println("及格")
} else {fmt.Println("不及格")
}
2 分支語句
分支語句會根據傳入條件的不同,選擇不同的分支代碼執行。
分支語句的示例模板:
switch var1 {case val1:... case val2:... case val3,val4:...case val5:...fallthrough // 添加該語句default:...
}
注意以下幾點:
-
和條件語句一樣,左花括號
{
必須與switch
處于一行; -
單個
case
中,可以出現多個結果選項(通過逗號分隔); -
Go語言中的分支語句不需要break來明確退出一個case;
-
只有在case中明確添加 fallthrough 關鍵字,才會繼續執行緊跟著的下一個case語句;
-
可以不設定 switch 之后條件表達式,這種情況下,整個 switch 結構與多個if...else...的邏輯作用等同。
一個簡單的分支語句示例:
score := 100
switch {
case score > 85:fmt.Println("優秀")
case score > 70 && score <= 85:fmt.Println("良好")
case score >= 60 && score <= 70:fmt.Println("及格")
default:fmt.Println("不及格")
}
Go語言中,可以通過逗號分隔不同的分支條件達到合并分支的目的,如 case 90,100,而不能像其他語言一樣,通過相鄰的case語句來進行分支的合并,這是因為Go語言不需要通過break退出某個分支,上一個case分支語句執行結束后,會自動進行退出,如果一定要執行后續的case語句,可以通過fallthrough語句來聲明。
month := 1
switch month {
case 3, 4, 5:fmt.Println("春季")
case 6, 7, 8:fmt.Println("夏季")
case 9, 10, 11:fmt.Println("秋季")
case 12:fmt.Println("冬季")fallthrough
case 1, 2:fmt.Println("冬季")
}
3 循環語句
Go語言中使用循環語句,需要注意以下幾點:
-
和條件語句、分支語句一樣,左花括號
{
必須與for處于同一行; -
只支持for關鍵字循環語句,不支持while和do-while結構的循環語句;
-
可以通過for-range結構對可迭代的集合進行遍歷;
-
支持基于條件判斷進行循環迭代;
-
允許在循環條件中定義和初始化變量,且支持多重賦值;
-
Go語言的for循環同樣支持continue和break來控制循環,但是它提供了一個更高級的break,可以選擇中斷哪一個循環。
3.1 for循環
Go語言的循環語句只支持 for 關鍵字,而不支持 while 和 do-while 結構,Go語言中,for循環的循環條件不包含括號,示例代碼如下:
sum := 0
for i :1; i <= 100; i++ {sum += i
}
fmt.Println(sum)
3.2 無限循環
Go語言僅支持for循環,針對無限循環的場景,可以通過不帶循環條件的for循環實現,代碼如下:
// 不指定循環語句,直接進行for循環,通過break退出循環語句
sum2 := 0
j := 0
for {j++if j > 100 {break}sum2 += j
}
3.3 多重循環
for 循環的條件表達式也支持多重賦值,可以實現數組/切片首尾元素的交換,代碼如下:
array := []int{1, 2, 3, 4, 5, 6} for i, j := 0, len(array)-1; i < j; i, j = i+1, j-1 {array[i], array[j] = array[j], array[i] } fmt.Println(array)
3.4 for-range結構
Go語言中支持通過for-range結構對于可迭代的集合(數組、切片、字典)進行循環遍歷,使用方式如下:
array := []int{1, 2, 3, 4, 5, 6}
for k, v := range array {fmt.Println(k, v)
}
也可以只獲取鍵,或者只獲取值,代碼示例如下:
// 只獲取鍵
for k := range array {fmt.Printf("%d ", k)
}
// 只獲取值
for _, v := range array {fmt.Printf("%d ", v)
}
3.5 基于條件判斷循環
只有滿足指定的條件才會執行循環體中的代碼,代碼示例如下:
sum := 0
i := 0
for i < 100 {i++sum += i
}
fmt.Println(sum)
4 跳轉語句
4.1 break與continue語句
Go語言支持在循環語句中通過break語句跳出循環,通過continue語句進入下一個循環。
break語句代碼示例:
sum := 0
i := 0
for {i++if i > 100 {break}sum += i
}
continue語句代碼示例:
for i = 0; i < 5; i++ {if i%2 == 0 {continue}fmt.Printf("%d ", i)
}
4.2 標簽
Go語言中的break和continue支持與標簽結合跳轉到指定的標簽語句,標簽通過 標簽名 :
進行聲明:
break 標簽代碼示例:
arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ITERATOR1:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {break ITERATOR1}fmt.Println(num)}
}
如上所示,當j>1,此時循環執行到arr[0,2],直接跳到標簽ITERATOR1的位置,也即跳出了外層循環,同樣的語句換成continue再次執行:
arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ITERATOR1:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {continue ITERATOR1}fmt.Println(num)}
}
4.3 goto語句
goto語句并不建議使用,因為很容易造成代碼的邏輯混亂,導致難以發現的Bug,代碼示例如下:
arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {goto EXIT}fmt.Println(num)}
}
EXIT:
fmt.Println("EXIT.")