go流程控制
1.if-else
用於測試條件是否成立,成立則執行if括起來的程式碼:
if condition {
//do something
}
如果需要在條件不滿足時執行,則只需要加上else即可:
if condition {
//do something
} else {
//do simething
}
如果存在多個條件,可以使用else-if增加新的判斷:
if condition1 {
//do something
} else if condition2 {
//do something
} else {
//do something
}
else-if的數量是沒有限制的,但是為了程式碼的可讀性,儘量少用else-if。
2.switch
go的switch使用非常靈活,接受任意形式的表示式:
switch var1 {
case val1:
//do something
case val2:
//do something
default:
//do something
}
var1可以是任何型別,而val和val2可以是同類型的任意值。你可以同時在一個分支中使用多個值:
case val1, val2, val3:
go中的switch不需要break來結束分支。如果需要在執行了一個case分支後繼續往後執行,只需要使用fallthrough關鍵字即可:
switch i {
case 0: fallthrough
case 1:
f()
}
當case後的語句只有一行時,可以直接將語句放在case後面。case後的執行語句也不需要花括號。case同樣支援邏輯判斷:
switch i {
case i > 0:
//do something
case i < -10:
//do something
default:
//do something
}
同樣的,可以使用return來提前結束程式碼塊的執行。
3.for
想要執行某些語句,go中可以使用for來執行。for的基本形式為:
for 初始化語句; 條件語句; 修飾語句 {
}
例子:
for i := 0; i < 3; i++ {
fmt.Println("for index = ", i)
}
輸出:
for index = 0
for index = 1
for index = 2
因為go具有平行復制的特性,所以也可以在for中使用多個計數器:
for i, j := 0, 10; i < j; i++, j = i + 1 {
}
也可以將兩個for迴圈巢狀使用:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
fmt.Println(j)
}
}
還可以迴圈一個Unicode字串:
str := "He To"
for i := 0; i < len(str); i++ {
fmt.Printf("for index = %d, is = %s", i, str[i])
}
輸出:
for index = 0, is = H
for index = 1, is = e
for index = 2, is =
for index = 3, is = T
for index = 4, is = o
for也支援純條件語句,可以將這個認為是沒有初始化語句和修飾語句的for迴圈:
i := 5
for i >= 0 {
i--;
fmt.Println(i)
}
輸出:
5
4
3
2
1
0
-1
for還有另外一個表達方式for-range,這是go特有的一種方式,在很多場景下都很實用,它可以迭代任何一個集合,一般形式為:
for i, val := range coll {}
val對應的是集合中對應索引的值拷貝,剛才的Unicode字串就可以直接使用range來迴圈:
str := "He To"
for i, val := range str {
fmt.Printf("for index = %d, is = %s", i, val)
}
4.Break和continue
break用於條件,迴圈語句中的退出操作,break做的作用結果是跳過整個程式碼塊,執行後續的操作。
例子:
for i := 0; i < 3; i++ {
for j := 0; j < 5; j++ {
if j > 3 {
break
}
fmt.Println(j)
}
fmt.Println()
}
輸出:
0123 0123 0123
關鍵字continue用於忽略迴圈體中剩餘分程式碼塊直接進入下一次迴圈,但不是無條件的執行下一次迴圈,執行之前依舊需要滿足條件判斷:
for i := 0; i < 5; i++ {
if i == 3 {
continue
}
fmt.Println(i)
}
//輸出
0 1 2
continue只能用於for迴圈中。
5.標籤Label與goto
for,switch都可以配合Label使用,即第一行第一個冒號:結尾的單詞:
LABEL1:
for i := 0; i < 5; i++ {
if i == 3 {
continue LABEL1
}
fmt.Println(i)
}
// 輸出
0 1 2 4 // 3被跳過了
但注意標籤和 goto 語句之間不能出現定義新變數的語句,否則會導致編譯失敗。
另外,可以使用goto語句和標籤配合使用來模擬迴圈
i:=0
HERE:
print(i)
i++
if i==5 {
return
}
goto HERE
但是這種方式是不推薦使用,如果一定要使用,將標籤放在goto的後面,但注意標籤和goto語句之間不能出現定義新變數的語句,否則會導致編譯失敗。
微信搜尋「goentry-xyz」,關注公眾號「燈下獨碼」