giantneco’s blog

技術メモ

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
}