【Golang基礎】defer執行順序


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,再執行刪除操作了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM