よく忘れるので備忘録。
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 が呼ばれるのは関数を抜けるときになります。