🐷

Go 言語の defer の挙動をまとめておく

2023/08/20に公開

Go 言語 100 Tips を読んでて、defer の挙動を分かってないなと思ったので自分用のまとめ。もう 10年ぐらい Go ばっかり書いてて、defer なんかめっちゃ書いてるんだが・・・😇

  • derfer にセットされた関数の引数はその場でセットされる
    • そのため、defer が呼ばれたときはセットされた値が利用される
    • 引数が値の場合、関数内で更新していてもそれは反映されない(値がコピーされているので)
    • 引数がポインタの場合、(ポインタが指すメモリを)関数内で更新していたら更新は反映される
  • defer に渡された関数が closure であるとき、その内部にとらわれた変数はその場では評価されない(関数の最終的な結果が利用される)
  • defer に 直接 渡されたのがレシーバの場合も同様。値レシーバかポインタレシーバかで決まる
    • 値レシーバなら即時に評価されている
    • ポインタレシーバなら関数の最終的な結果が利用される

まぁ、defer で複雑なことしないようにしているし、単純な使い方でなければ動作確認するからいままで defer で痛い目見たことはないけれど、整理しておけばもう迷うこともないだろう。

Happy hacking!

Discussion