https://zenn.dev/yuyu_hf/articles/c7ab8e435509d2
最近、Goの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
}