emahiro/b.log

日々の勉強の記録とか育児の記録とか。

defer の順序

よく忘れるので備忘録。

https://play.golang.org/p/n5aHnATxXMr

上記の例だと cb() が実行された時点で呼ばれ b が出力される。
defer は関数を抜けるときに呼ばれるので cb()() を宣言すると func cb() func() の return で指定した関数が呼ばれる。

つまり defer cb()() では最初と最後にそれぞれ cb() で実装した内容が呼ばれることになる。

追記: メソッドを繋いだときの挙動

logger や trace を使うときに多いですが、defer で関数から抜けるときに Finish したり、Flush してメモリを解放する処理を行いたいケースがあると思います。
そう言った場合でも defer で一括りにしちゃうことが可能です。
以下のケースでが New が実行されるのは関数が呼び出された直後ですが、Finish が呼ばれるのは関数を抜けるときになります。

ref: https://play.golang.org/p/3U6WsyEJzLx