背景
Jxckさんのgihyo連載
でGoを触っていて、以下の記載を読んで、エラー処理でlog.Fatal
とかしていたら実行されないのでどういう仕組なのか遊んだメモです。
先の例ではfile.Close()の関数呼び出しをdeferの後ろに記述すると,この処理がmain()を抜ける直前に必ず実行されるようになります。
処理順序
Golang の defer 文と panic/recover 機構について にてdeferが記述されたstatementが関数を抜ける直前に実行されることがわかります。
(Jxckさんの記事では「必ず」じゃなくて「直前」ってほうが言いたいことだったんですね......)
上記に加えて複数defer付けたらどうなるのか試してみました。
gist7b299b8f60a9ac6a3296f9d8f09fbfa5
実行結果です。
[vagrant@localhost gihyotest]$ go run defer.go execute this statement firstly execute this statement secondly execute this statement thirdly
後入れ先出しになっていることがわかります。
記事を書いてからReference見てたら Goブログでそのまんま同じことやっていますし、 以下のように記載されていました。
Deferred function calls are executed in Last In First Out order after the surrounding function returns.