複数戻り値(Goならでは)
2つ返せる
Go
func divide(a, b int) (int, int) {
return a / b, a % b
}
quotient, remainder := divide(10, 3) // 3, 1戻り値の型を括弧で並べると、複数を返せます。受け取る側もカンマで並べます。
多くの言語では、2つ返したいときに配列やオブジェクトに詰める必要があります。Go はそのまま返せます。
何のためにあるのか
本当の狙いは「2つの計算結果を返す」ことではありません。結果と、うまくいったかどうかを一緒に返すことです。
Go
func findPrice(name string) (int, bool) {
if name == "きのこ図鑑" {
return 1200, true
}
return 0, false
}2つ目の bool が「見つかったか」を表します。
これが無いと、見つからなかったときに何を返せばよいか困ります。0 を返すと、0円の商品と区別が付きません。第2章のゼロ値のところで触れた「正しい 0 なのか、入れ忘れた 0 なのか分からない」という問題が、ここで解決します。
Go
price, found := findPrice("謎の箱")
if !found {
return "見つかりません"
}! は「でない」という意味です。found が偽のときに真になります。
使わない戻り値は _ にする
2つ返るうち片方が要らないとき、変数を作ると「使っていない」と怒られます。
Go
price, found := findPrice("きのこ図鑑")
fmt.Println(price) // found を使っていないのでエラーこういうときは _ を使います。
Go
price, _ := findPrice("きのこ図鑑")_ は「受け取るけれど捨てる」という印です。変数ではないので、使わなくても怒られません。
ただし、これを乱用すると失敗を握りつぶすことになります。次のレッスンで扱う error を _ で捨てるのは、Go で最も嫌われる書き方の1つです。
戻り値に名前を付けられる
Go
func findPrice(name string) (price int, found bool) {
...
}戻り値にも名前を付けられます。読む人に「1つ目が価格、2つ目が見つかったか」と伝わります。
短い関数では書かないことのほうが多いですが、戻り値が3つ以上あって順番を間違えそうなときには効きます。
要件
findPriceは(int, bool)を返すきのこ図鑑は 1200、中古スマホは 24800、おまけは 0。いずれも見つかった扱い- それ以外は 0 と見つからなかった扱い
describeSearchは見つかったら商品名 N円、無ければ商品名 は見つかりませんを返す
入出力例
describeSearch("きのこ図鑑") → "きのこ図鑑 1200円"
describeSearch("中古スマホ") → "中古スマホ 24800円"
describeSearch("おまけ") → "おまけ 0円"
describeSearch("謎の箱") → "謎の箱 は見つかりません"ヒント
編集 ゆめさく編集部