Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

deferでリソースの閉じ忘れを防止する

前回の事例でもちょっと触れたdeferについて。
これは例外の地獄ネストを回避するための素敵な機能です。

実際のところ

一時ファイルを使う場合の事例は以下の通り。

import (
	"io/ioutil"
)

func Something () {
	file, _ := ioutil.TempFile(os.TempDir(), "")

	defer os.Remove(file.Name())
	defer file.Close()

        //something to do
}

なにが良いかというと……
リソースを作った直後に開放処理を記述できるので見通しがよくなります。

deferはキューされて処理されます。
今回の場合、ファイルポインタを閉じてから、ファイルの実体を消すようにしています。
こうしないとWindows系では意図せずクラッシュする事もあるそうなので注意してください。

参考もと

golang.jp
github.com