🐷
Go 言語の defer の挙動をまとめておく
Go 言語 100 Tips を読んでて、defer の挙動を分かってないなと思ったので自分用のまとめ。もう 10年ぐらい Go ばっかり書いてて、defer なんかめっちゃ書いてるんだが・・・😇
- derfer にセットされた関数の引数はその場でセットされる
- そのため、defer が呼ばれたときはセットされた値が利用される
- 引数が値の場合、関数内で更新していてもそれは反映されない(値がコピーされているので)
- 引数がポインタの場合、(ポインタが指すメモリを)関数内で更新していたら更新は反映される
- defer に渡された関数が closure であるとき、その内部にとらわれた変数はその場では評価されない(関数の最終的な結果が利用される)
- defer に 直接 渡されたのがレシーバの場合も同様。値レシーバかポインタレシーバかで決まる
- 値レシーバなら即時に評価されている
- ポインタレシーバなら関数の最終的な結果が利用される
まぁ、defer で複雑なことしないようにしているし、単純な使い方でなければ動作確認するからいままで defer で痛い目見たことはないけれど、整理しておけばもう迷うこともないだろう。
Happy hacking!
Discussion