5.7 defer 陳述式

Go 的 defer 關鍵字可用來將一個函式呼叫的執行時機延後至包覆函式(surrounding function)結束之前才執行,常用於清理資源(例如確保關閉資料庫連線)。

範例:

func main() {
    defer fmt.Println("World") // 離開 main 函式之前才執行此敘述。
    fmt.Println("Hello")
}

輸出結果:

Hello
World

清理資源

範例:

func doSomething() error {
  f, err := os.Open("test.txt")
  if err != nil {
    return err
  }
  defer f.Close()

  // 繼續處理檔案內容
}

注意:一旦檔案開啟成功,接著立刻加上 defer f.Close(),然後才處理後續的檔案操作,如此便可確保此函式離開之前會關閉檔案。

後進先出

如果在一個函式中使用了多次 defer,那些被延遲的函式呼叫將會以後進先出的順序執行。

範例:

func main() {
    defer fmt.Println(1)
    defer fmt.Println(2)
    defer fmt.Println(3)
}

輸出結果:

3
2
1

另外要注意的是,延後執行的時機除了函式正常返回,還有一種情況:goroutine 發生了執行時期的 panics。相關細節與注意事項可參閱官方文件:Defer statements


先這樣,也許有空時會再更新。   我的其他站點:      

Last modified: 2024-10-15