defer 執行順序類似棧的先入后出原則(FILO)
一個defer引發的小坑:打開文件,讀取內容,刪除文件
// 原始問題代碼 func testFun(){ // 打開文件 file, err := os.Open(path) defer file.Close() // do something // 刪除文件 defer func() { removeErr := os.Remove(path) if removeErr != nil { fmt.Println(removeErr) } }() }
如果像上面這樣寫的話,實際開發時是會報錯的。
The process cannot access the file because it is being used by another process.
錯誤原因也很明了:這個文件被其他程序占用了,不能夠刪除。主要是因為file處於未關閉狀態,所以不能進行刪除操作
// 修正后的代碼 func testFun(){ // 打開文件 file, err := os.Open(path) // do something // 刪除文件 defer func() { removeErr := os.Remove(path) if removeErr != nil { fmt.Println(removeErr) } }() defer file.Close() }
我們需要調整defer的順序,這樣的話會就會先關閉file,再執行刪除操作了。