Go言語の複数戻り値とは?returnで複数値を返す方法と使い方をやさしく解説
生徒
「Go言語って、関数から複数の値を一度に返せるって聞いたんですが、本当ですか?」
先生
「はい、本当です。Go言語では関数から複数の値をまとめて返すことができます。他の言語ではちょっと面倒な処理も、Go言語ではシンプルに書けるのが特徴ですよ。」
生徒
「具体的にどうやって書くんですか?プログラミングは初めてなので、できるだけわかりやすく教えてください!」
先生
「それでは、Go言語の複数戻り値について、順番にやさしく説明していきましょう!」
1. 複数戻り値(Multiple Return Values)とは?
Go言語(Golang)の大きな特徴のひとつに、関数から複数の値をまとめて返せる「複数戻り値」という仕組みがあります。これは、ひとつの処理で結果だけでなく、その処理が正しく行えたかどうか、追加の情報まで返したいときにとても便利です。
たとえば、計算をしたときに「計算した答え」と「その答えが正しいかどうか」を同時に返したい場面があります。従来の言語では特別な仕組みが必要でしたが、Go言語では自然な書き方で実現できます。
イメージとしては、ひとりの人が「片手にリンゴ、もう片手にみかん」を持って帰ってくるようなものです。関数にお願いすると、一度に複数の情報を届けてくれるイメージです。
とても簡単な例で見てみましょう。
package main
import "fmt"
func hello() (string, string) {
return "こんにちは", "Go言語"
}
func main() {
a, b := hello()
fmt.Println(a) // こんにちは
fmt.Println(b) // Go言語
}
このように、helloという関数を呼び出すだけで、2つの文字列が返ってきます。特別なことをしなくても自然な文法で書けるので、プログラミング初心者でも扱いやすいのが魅力です。
2. Go言語のreturn文で複数の値を返す書き方
まずはシンプルな例から見てみましょう。次のコードは、2つの数を足した結果と引いた結果を一度に返す関数です。
package main
import "fmt"
func calc(a int, b int) (int, int) {
sum := a + b
diff := a - b
return sum, diff
}
func main() {
result1, result2 := calc(10, 4)
fmt.Println("合計:", result1)
fmt.Println("差分:", result2)
}
このように、func calcの定義部分で(int, int)と書くことで、2つのint型(整数)を返すことを意味しています。
return sum, diffと書くことで、2つの値を返しています。
3. 実行結果を見てみよう
このプログラムを実行すると、次のように表示されます。
合計: 14
差分: 6
関数から2つの値が返ってきて、それぞれ変数に分けて受け取ることができていますね。
4. 値を一部だけ受け取りたいときは「_(アンダースコア)」を使う
関数から2つの値が返ってきても、「1つしか使わない」こともよくあります。そんなときは、使わない値の代わりに _(アンダースコア)を使います。
package main
import "fmt"
func calc(a int, b int) (int, int) {
sum := a + b
diff := a - b
return sum, diff
}
func main() {
result1, _ := calc(8, 3)
fmt.Println("合計だけ表示:", result1)
}
このように書くと、「差分」は使わないという意味になります。変数を無駄にしない便利な書き方です。
5. 複数戻り値の実用例:割り算で商と余りを返す
実際のプログラムでは、たとえば割り算の結果として「商(わる数の答え)」と「余り」の両方がほしいことがあります。
そんなときにも、複数戻り値を使えばとてもシンプルです。
package main
import "fmt"
func divide(a int, b int) (int, int) {
quotient := a / b
remainder := a % b
return quotient, remainder
}
func main() {
q, r := divide(17, 5)
fmt.Println("商:", q)
fmt.Println("余り:", r)
}
このようにして、2つの値を一度に受け取ることができます。
6. 名前付き戻り値でコードを読みやすくする
Go言語では、関数の戻り値に「名前」をつけることもできます。これはコードの可読性(読みやすさ)を高めたいときに便利です。
package main
import "fmt"
func info() (name string, age int) {
name = "田中"
age = 25
return
}
func main() {
n, a := info()
fmt.Println("名前:", n)
fmt.Println("年齢:", a)
}
returnのあとに何も書いていないのに、ちゃんと2つの値が返ってきているのがポイントです。
7. 複数戻り値はGo言語の大きな強み
多くのプログラミング言語では、関数から戻せる値は1つだけという制限があります。そのため、複数の値を返したいときは、配列や構造体を使う必要がありました。
しかし、Go言語では標準の文法として複数戻り値が使えるため、とても簡単で直感的です。
また、エラー処理との組み合わせでもよく使われます。たとえば「値」と「エラーオブジェクト」を同時に返すような場面です(※エラー処理は別の記事で扱います)。