Go defer 遇上 os.Exit 時失效
間單介紹 defer 使用與特性,並說明遇上 os.Exit 失效的原因
前言
在撰寫 Go 程式過程中,我們可能需要在函式執行完畢後執行特定動作以確保不會發生異常,比方說讀取檔案完畢後需要關閉 file descriptor
。
為求程式簡潔,最常見的做法是呼叫 defer
進行處理。以下會對 defer
幾個特性做簡介,並且說明在什麼狀況下 deffered function
不會如預期般被執行。
若沒有耐心者,可直接跳到 當 defer 遇上 os.Exit 看本文重點 (笑)
defer 簡介
寫程式時常會遇到需要讀寫檔案、建立連線等行為,在 Go 內類似的操作往往伴隨著關閉 file descriptor 或 connection 的相關操作。
file.Close()
除非偏好波動拳寫法以外
否則 early return 寫法往往會包含多個 return
,若此時需要在每個 return 前寫同樣的程式碼往往導致簡潔性被破壞。
func fileCopyv1(srcFile, dstFile string) (int64, error) {
src, err := os.Open(srcFile)
if err != nil {
return 0, err
}
dst, err := os.Create(dstFile)
if err != nil {
src.Close()
return 0, err
}
src.Close()
dst.Close()
return io.Copy(dst, src)
}