1. 程式人生 > 其它 >[Go] Go中延遲語句defer的注意事項

[Go] Go中延遲語句defer的注意事項

技術標籤:指標javagopythongolang

defer語句在不對的位置出現 , 會出現錯誤

file, err := os.Open("/null")
defer file.Close()
 
if err != nil {
    fmt.Println("open error! ", err)
    return
}
    res, err := http.Get("http://www.google.com") // 不翻牆的情況下。是無法訪問滴
    defer res.Body.Close()
    if err != nil {
        return err
    }

這倆個程式碼就是會報錯

因為把defer放在err判斷前面了,當出現錯誤err判斷直接return時,會去呼叫defer

這個時候file和res都是空指標,呼叫會報錯

defer與閉包函式在一塊時要注意

    var nums [5]int{1,2,3,4,5}
    for i := range nums {
        defer func() { fmt.Println(i) }()
    }

閉包函式裡面的i是使用的最後一次迴圈的值,因此會列印5個5

還要注意defer的呼叫順序是先進後出,以及defer後面的語句在執行的時候,函式呼叫的引數會被儲存起來,但是不執行。也就是複製了一份。

但是當使用了結構體指標呼叫的時候,沒有把它當引數看待