1. 程式人生 > >go流程控制

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」,關注公眾號「燈下獨碼」