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