1. 程式人生 > 其它 >Golang學習-CH4 Go語言流程控制

Golang學習-CH4 Go語言流程控制

目錄

4.1 Go語言if-else分支結構

if condition1 {
    // do something
} else if condition2 {
    // do something else
}else {
    // catch-all or default
}

關鍵字 if 和 else 之後的左大括號{必須和關鍵字在同一行,如果你使用了 else if 結構,則前段程式碼塊的右大括號}必須和 else if 關鍵字在同一行,這兩條規則都是被編譯器強制規定的。

特殊寫法:可以在 if 表示式之前新增一個執行語句,再根據變數值進行判斷

if err := Connect(); err != nil {
    fmt.Println(err)
    return
}

這種寫法可以將返回值與判斷放在一行進行處理,而且返回值的作用範圍被限制在 if、else 語句組合中。

在程式設計中,變數的作用範圍越小,所造成的問題可能性越小。

4.2 Go語言for迴圈結構

Go語言中的迴圈語句只支援 for 關鍵字,而不支援 while 和 do-while 結構

sum := 0
for i := 0; i < 10; i++ {
    sum += i
}
  • 左花括號{必須與 for 處於同一行。

  • Go語言中的 for 迴圈與C語言一樣,都允許在迴圈條件中定義和初始化變數,唯一的區別是,Go語言不支援以逗號為間隔的多個賦值語句,必須使用平行賦值的方式來初始化多個變數

  • Go語言的 for 迴圈同樣支援 continue 和 break 來控制迴圈,但是它提供了一個更高階的 break,可以選擇中斷哪一個迴圈。

    JLoop:
    //解決了C++中break跳兩層迴圈時需要標識變數的問題
    for j := 0; j < 5; j++ {
        for i := 0; i < 10; i++ {
            if i > 5 {
                break JLoop
            }
            fmt.Println(i)
        }
    }
    
  • Go語言無限死迴圈

    var i int
    //C 風格
    for ; ; i++ {
        if i > 10 {
            break
        }
    }
    //go為了解決上述C風格
    for {
        if i > 10 {
            break
        }
        i++
    }
    
  • 只有一個迴圈條件的迴圈

    //類似while
    var i int
    for i <= 10 {
        i++
    }
    

4.3 Go語言for range(鍵值迴圈)

for range 結構是Go語言特有的一種的迭代結構,在許多情況下都非常有用,for range 可以遍歷陣列、切片、字串、map 及通道(channel),for range 語法上類似於其它語言中的 foreach 語句

for key, val := range coll {
    ...
}
//迭代遍歷字串:能夠自動根據 UTF-8 規則識別 Unicode 編碼的字元。
for pos, char := range str {
    ...
}

需要注意:val 始終為集合中對應索引的值拷貝,因此它一般只具有隻讀性質,對它所做的任何修改都不會影響到集合中原有的值。

遍歷通道:

for range 可以遍歷通道(channel),但是通道在遍歷時,只輸出一個值,即管道內的型別對應的資料。

c := make(chan int)
go func() {
    c <- 1
    c <- 2
    c <- 3
    close(c)
}()
for v := range c {
    fmt.Println(v)	//不斷地從通道中取資料,直到通道被關閉。
}

4.4 Go語言switch case語句

Go語言的 switch 要比C語言的更加通用,表示式不需要為常量,甚至不需要為整數,case 按照從上到下的順序進行求值,直到找到匹配的項,如果 switch 沒有表示式,則對 true 進行匹配,因此,可以將 if else-if else 改寫成一個 switch。

Go語言改進了 switch 的語法設計,case 與 case 之間是獨立的程式碼塊,不需要通過 break 語句跳出當前 case 程式碼塊以避免執行到下一行

解決了C++中常要寫break的痛點

基本寫法

var a = "hello"
switch a {
case "hello":
    fmt.Println(1)
case "world":
    fmt.Println(2)
default:
    fmt.Println(0)
}

Go語言規定每個 switch 只能有一個 default 分支。

一分支多值

var a = "mum"
switch a {
case "mum", "daddy":
    fmt.Println("family")
}

不同的 case 表示式使用逗號分隔。

分支表示式

var r int = 11
switch {	//switch後臨界大括號
case r > 10 && r < 20:
    fmt.Println(r)
}

注意,這種情況的 switch 後面不再需要跟判斷變數。某種程度上已經完全可以替代if-else

跨越 case 的 fallthrough

在Go語言中 case 是一個獨立的程式碼塊,執行完畢後不會像C語言那樣緊接著執行下一個 case,但是為了相容一些移植程式碼,依然加入了 fallthrough 關鍵字來實現這一功能

var s = "hello"
switch {
case s == "hello":
    fmt.Println("hello")
    fallthrough
case s != "world":
    fmt.Println("world")
}

//輸出結果:
//hello
//world

新編寫的程式碼,不建議使用 fallthrough。

4.5 Go語言goto語句——跳轉到指定的標籤

    err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()

4.6 Go語言break(跳出迴圈)

Go語言中 break 語句可以結束 for、switch 和 select 的程式碼塊,另外 break 語句還可以在語句後面新增標籤,表示退出某個標籤對應的程式碼塊,標籤要求必須定義在對應的 for、switch 和 select 的程式碼塊上。

單break的用法也仍然存在。

func main() {
OuterLoop:
    for i := 0; i < 2; i++ {
        for j := 0; j < 5; j++ {
            switch j {
            case 2:
                fmt.Println(i, j)
                break OuterLoop
            case 3:
                fmt.Println(i, j)
                break OuterLoop
            }
        }
    }
}

4.7 Go語言continue(繼續下一次迴圈)

Go語言中 continue 語句可以結束當前迴圈,開始下一次的迴圈迭代過程,僅限在 for 迴圈內使用,在 continue 語句後新增標籤時,表示開始標籤對應的迴圈。

單continue的用法也仍然存在。

package main
import "fmt"
func main() {
OuterLoop:
    for i := 0; i < 2; i++ {
        for j := 0; j < 5; j++ {
            switch j {
            case 2:
                fmt.Println(i, j)
                continue OuterLoop
            }
        }
    }
}