16.3 發生錯誤時使用defer關閉一個文件

如果你在一個for循環內部處理一系列文件,你需要使用defer確保文件在處理完畢後被關閉,例如:

for _, file := range files {
    if f, err = os.Open(file); err != nil {
        return
    }
    // 這是錯誤的方式,當循環結束時文件沒有關閉
    defer f.Close()
    // 對文件進行操作
    f.Process(data)
}

但是在循環結尾處的defer沒有執行,所以文件一直沒有關閉!垃圾回收機制可能會自動關閉文件,但是這會產生一個錯誤,更好的做法是:

for _, file := range files {
    if f, err = os.Open(file); err != nil {
        return
    }
    // 對文件進行操作
    f.Process(data)
    // 關閉文件
    f.Close()
 }

defer僅在函數返回時纔會執行,在循環的結尾或其他一些有限範圍的代碼內不會執行。

鏈接

results matching ""

    No results matching ""