https://zenn.dev/yuyu_hf/articles/c7ab8e435509d2

はじめに

最近、GoのNamed return valueに関する話題を見かけたり、コードレビューでNamed return valueについて説明をすることがありました。 せっかくなので、Named return valueのメリデメを自分の主観でまとめます。

Named return value

Goでは、関数の戻り値に名前をつけて変数として利用することができます。 この仕組みをNamed return valueといいます。

メリット

変数名から、戻り値が何かわかる

関数の戻り値に名前をつけると、変数名から何の値かわかるようになります。 関数名や型から戻り値が何か明らかでないときに役立ちます。

具体例を示すために、Effective Goのサンプルコードを引用します。

nextInt関数はint型の変数を2つ返します。 しかし、nextIntという名前から何の値が返されるかはわかりません。 戻り値を知るために関数の中身を読む必要があります。

func nextInt(b []byte, pos int) (int, int) {

戻り値に名前をつけると、変数名から何の値が返されるかわかります。 戻り値を知るために関数の中身を読む必要はないです。

func nextInt(b []byte, pos int) (value, nextPos int) {

コードが短くなることがある

Named return valueを使うと、関数を実行し始めるときに変数が宣言されます。 関数の中で変数を宣言する必要がないので、関数内のコードが短くなります。

具体例を示すために、Effective Goのサンプルコードを引用します。

以下の関数では、引数のbufから読み取った値を、nに足しています。 Named return valueを使うと、関数内で変数nを宣言する必要がありません。

func ReadFull(r Reader, buf []byte) (n int, err error) {
    for len(buf) > 0 && err == nil {
        var nr int
        nr, err = r.Read(buf)
        n += nr
        buf = buf[nr:]
    }
    return
}

シンプルに実装できることがある