天天看點

Golang控制流

條件語句

if語句

下面是Golang的if語句,需要注意的是條件判斷塊不需要小括号,而且if語句的大括号不能省略,即使其中隻有一行語句。

if condition == true {
    fmt.Println("條件為真")
} else {
    fmt.Println("條件為假")
}
           

if語句可以包含一個初始化塊,初始化塊和判斷條件中使用

;

分隔。初始化塊用來初始化可能在語句中使用的變量,這些變量的作用域是if語句。

if i := 0; i == 0 {
    fmt.Println("i==0")
} else {
    fmt.Println("i!=0")
}
           

switch語句

如果需要多重條件判斷,可以使用switch語句。和if語句一樣,switch語句可以擁有一個初始化塊。而且在switch語句中,case子句是預設中斷的,也就是說,如果比對到了某個case子句,就不會執行其他語句,而是直接結束。如果希望執行某個case子句之後繼續執行下面的其他子句,需要使用

fallthrough

關鍵字。

switch x := 0; x {
case 0:
    fmt.Println(0)
case 1:
    fmt.Println(1)
case 2:
    fallthrough
case 3:
    fmt.Println("2<=x<=3")
default:
    fmt.Println("other")
}
           

switch語句可以沒有條件,這時候相當于

switch true

。這是一種非常友善的聲明多級

if-else

語句的方式。

var i = 0
//沒有代碼塊預設為switch true,相當于多級if-else
switch {
case i == 0:
    fmt.Println("i==0")
case i == 1:
    fmt.Println("i==1")
default:
    fmt.Println("other")
}
           

循環語句

for循環

除了不使用小括号之外,Golang的for循環和其他語言的沒什麼差別。

for i := 0; i < 5; i++ {
    fmt.Print(i)
}
fmt.Println()
           

for循環(while)

for循環可以省略循環前後語句,隻留下條件判斷。

i = 0
for ; i < 1000; {
    i++
}
           

這時候可以省略前後分号,這種情況下for循環和while循環等價。

i := 0
for i < 1000 {
    i++
}
           

如果要使用無限循環,把整個條件塊去掉就行了。

i = 0
//無限循環
for {
    if i == 500 {
        break
    }
    i++
}
           

推遲語句(Defer)

Golang官方教程把這個推遲語句也放到了控制流裡面,不過我不知道合适不合适。所謂推遲語句,會在目前語句所在的代碼塊結束的時候執行。是以,推遲語句常常用來釋放代碼中使用的資源。如果代碼塊中有多個推遲語句,會按照從後到前的方式依次執行。

是以,在代碼中每使用一個資源,我們隻要馬上緊接着寫對應的釋放語句,在代碼塊結束之後就能以完美的方式釋放資源了。

func deferStatement() {
    //推遲語句,該語句會在所在代碼塊結束時調用
    //推遲語句的參數求值是立即求值的,隻有調用是推遲的
    //如果存在多個推遲語句,按照站的方式執行,即前面的語句後執行
    fmt.Println("使用了資源1")
    defer fmt.Println("釋放了資源1")

    fmt.Println("使用了資源2")
    defer fmt.Println("釋放了資源2")

    fmt.Println("使用了資源3")
    defer fmt.Println("釋放了資源3")

    fmt.Println("使用這些資源處理資料")
}
           

上面這段代碼的執行結果很完美。

使用了資源1
使用了資源2
使用了資源3
使用這些資源處理資料
釋放了資源3
釋放了資源2
釋放了資源1
           

推遲語句中的參數是立即求值的,推遲語句的調用會推遲到代碼塊結束時。這一點需要注意。