Go 基礎知識之分支迴圈

smallfish1發表於2018-03-09

在編寫 Go 程式的時候,我們不僅會用前面學到的資料結構來儲存資料,還會用到 ifswitchfor 來進行條件判斷和流程控制,今天我們就來一起學習下它們。

if

if 主要用於條件判斷,語法為:

if 條件 {
  # 業務程式碼
}

先看一個簡單例子:

package main

import "fmt"

func main() {
    age := 7

    if age > 6 {
        fmt.Println("It's primary school")
    }
}

我們可以在條件中使用 &|| 來進行組合判斷:

package main

import "fmt"

func main() {
    age := 7

    if age > 6 && age <= 12 {
        fmt.Println("It's primary school")
    }
}

我們還可以使用 if..else if..else 來實現多分支的條件判斷:

package main

import "fmt"

func main() {
    age := 13

    if age > 6 && age <= 12 {
        fmt.Println("It's primary school")
    } else if age > 12 && age <= 15 {
        fmt.Println("It's middle school")
    } else {
        fmt.Println("It's high school")
    }
}

switch

如果我們的條件分支太多,可以考慮使用 switch 替換 if, 例如:

package main

import "fmt"

func main() {
    age := 10

    switch age {
    case 5:
        fmt.Println("The age is 5")
    case 7:
        fmt.Println("The age is 7")
    case 10:
        fmt.Println("The age is 10")
    default:
        fmt.Println("The age is unkown")
    }
}

注意:在 Go 中 switch 只要匹配中了就會中止剩餘的匹配項,這和 Java 很大不一樣,它需要使用 break 來主動跳出。

switchcase 條件可以是多個值,例如:

package main

import "fmt"

func main() {
    age := 7

    switch age {
    case 7, 8, 9, 10, 11, 12:
        fmt.Println("It's primary school")
    case 13, 14, 15:
        fmt.Println("It's middle school")
    case 16, 17, 18:
        fmt.Println("It's high school")
    default:
        fmt.Println("The age is unkown")
    }
}

注意: 同一個 case 中的多值不能重複。

switch 還可以使用 if..else 作為 case 條件,例如:

package main

import "fmt"

func main() {
    age := 7

    switch {
    case age >= 6 && age <= 12:
        fmt.Println("It's primary school")
    case age >= 13 && age <= 15:
        fmt.Println("It's middle school")
    case age >= 16 && age <= 18:
        fmt.Println("It's high school")
    default:
        fmt.Println("The age is unkown")
    }
}

小技巧: 使用 switchinterface{} 進行斷言,例如:

package main

import "fmt"

func checkType(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("%v is an int\n", v)
    case string:
        fmt.Printf("%v is a string\n", v)
    default:
        fmt.Printf("%v's type is unkown\n", v)
    }
}

func main() {
    checkType(8)
    checkType("hello, world")
}

for

使用 for 來進行迴圈操作,例如:

package main

import "fmt"

func main() {
    for i := 0; i < 2; i++ {
        fmt.Println("loop with index", i)
    }
}

使用 for..range 對陣列、切片、map、 字串等進行迴圈操作,例如:

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3}

    for i, v := range numbers {
        fmt.Printf("numbers[%d] is %d\n", i, v)
    }
}

注意: 這裡的 iv 是切片元素的位置索引和值。

package main

import "fmt"

func main() {
    cityCodes := map[string]int{
        "北京": 1,
        "上海": 2,
    }

    for i, v := range cityCodes {
        fmt.Printf("%s is %d\n", i, v)
    }
}

注意: 這裡的 ivmap 的 一組鍵值對的鍵和值。

使用 continuebreak 對迴圈進行控制,例如:

package main

import "fmt"

func main() {
    numbers := []int{1, 2, 3, 4, 5}

    for i, v := range numbers {
        if v == 4 {
            break
        }

        if v%2 == 0 {
            continue
        }

        fmt.Printf("numbers[%d] is %d\n", i, v)
    }
}

注意:

  • break 會結束所有迴圈。
  • continue 會跳過當前迴圈直接進入下一次迴圈。

更多閱讀,請關注

相關文章