1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go】名前付き戻り値を使うべきなのか

Last updated at Posted at 2024-07-14

ブランクreturnの挙動

名前付き戻り値は以下のようにブランクreturnを使用することができる。

package main

import "fmt"

func add(num1, num2 int) (addResult int) {
	addResult = num1 + num2;
	return 
}

func main() {
	fmt.Println(add(1, 2)) //3
}

ではブランクreturnに誤って引き算の計算結果を記述した際の動作はどうなるのだろうか。

package main

import "fmt"

func add(num1, num2 int) (addResult int) {
	addResult = num1 + num2;
	return num1 - num2
}

func main() {
	fmt.Println(add(1, 2)) // -1
}

addメソッドは-1を返してしまうようだ。名前付き戻り値はreturnに値を記述した時はその値を返してしまうようだ。

名前付き戻り値を使うべきなのか?

このことからeffective_goからも分かるように名前付き戻り値を指定した場合はブランクreturnとの組み合わせが一般的なようだ。
私は名前付き戻り値を使うべきではないと思う。名前付き戻り値が悪いというより、ブランクreturnが良くない。ブランクreurnを書いてしまうとその変数が最後にどこで代入されているかを見ないといけないのでコードが非常に見にくくなってしまう。
参考書籍にも以下の記載がある。

関数が値を返すなら、絶対にブランクreturnを使ってはなりません。実際に返される値が非常にわかりにくくなる場合があります。

個人的には名前付き戻り値は必ずその変数名を返却するような仕様に変更してほしい。。

おまけ

名前付き戻り値に指定した変数をメソッド内で代入しなかった場合は初期値が返される。

package main

import "fmt"

func add(num1, num2 int) (addResult int) {
	return
}

func main() {
	fmt.Println(add(1, 2)) // 0
}

参考

effective_go
初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?