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僅在函數返回時纔會執行,在循環的結尾或其他一些有限範圍的代碼內不會執行。
鏈接
- 目錄
- 上一節:誤用字符串
- 下一節:何時使用new()和make()