No.47 defer 引数とレシーバーがどのように評価されるかを知らない
知っていたけどまんまと罠にハマった
code:mistake.go
func fn() (err error) {
defer trace.spanEnd(err) // 1
defer tx.finsh(err) // 2
// 処理
}
named return value で err = nilが初期値として宣言されているので、どんな場合も1, 2は引数に nil が与えられる
code:correct.go
func fn() (err error) {
defer func() {
trace.spanEnd(err)
tx.finsh(err)
}()
}
ポインタを渡すという方法もあるが関数のシグニチャが変わるのでクロージャにするのがいいだろう