Go の名前付き返り値
Go の名前付き返り値の扱いでちょっと迷ったのでメモ。
名前付き返り値を使うとローカル変数扱いにされるとはわかっていた。
return
文で新しいインスタンスを作って返した場合もちゃんとケアされるか不安だった。
仕様見ても明記されている箇所が見つけられずよくわからんかったし。
で下のようなコードで確認してみると杞憂だったのがわかった。よかったね。
どうもreturn
文の時点で名前付き返り値に代入されるようなイメージで良いらしい。
package main import ( "errors" "fmt" ) func f1() (err error) { return errors.New("hoge") } func f2() (err error) { defer func(){ err = errors.New("huga") }() return errors.New("hoge") } func f3() (err error) { defer func(){ err = errors.New("huga") }() err = errors.New("hoge") return err } func main() { fmt.Println("Hello, playground") fmt.Printf("f1: %v\n", f1()) // hoge fmt.Printf("f2: %v\n", f2()) // huga fmt.Printf("f3: %v\n", f3()) // huga }