ブランク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
}