[Go] Go中延遲語句defer的注意事項
阿新 • • 發佈:2020-12-28
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後面的語句在執行的時候,函式呼叫的引數會被儲存起來,但是不執行。也就是複製了一份。
但是當使用了結構體指標呼叫的時候,沒有把它當引數看待