Golangのdeferの処理順序

背景

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.

参考