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文で複数の値を返す書き方
複数戻り値の基本は「宣言で戻り値の数と型を並べる」「returnで値をカンマ区切りで並べる」「呼び出し側も変数をカンマ区切りで受け取る」の3点です。ポイントは並び順がそのまま対応すること。左から順に1番目、2番目…として受け取られます。
まずはシンプルな例です。2つの数を足した結果と引いた結果を、1回の関数呼び出しで受け取ります。引数と戻り値の型はintで、戻り値リストは(int, int)のように括弧で並べます。
package main
import "fmt"
// 2つの整数を受け取り、合計と差分をこの順で返す
func calc(a int, b int) (int, int) {
sum := a + b
diff := a - b
return sum, diff // カンマで並べて返す
}
func main() {
// 左の変数から順に、返り値1・返り値2が入る
total, delta := calc(10, 4)
fmt.Println("合計:", total)
fmt.Println("差分:", delta)
}
戻り値の「順番」はとても重要です。たとえばreturn diff, sumのように入れ替えると、呼び出し側に渡る意味も逆になります。受け取り側の変数名は自由に付けられますが、どの値がどの変数に入るかを意識して、読みやすい名前を付けると理解がぐっと楽になります(使わない値の扱いは後の節で紹介します)。
なお、戻り値の型は同じである必要はありません。実務では「結果」と「状態」を一緒に返すケースが多く、たとえば(string, bool)のように異なる型の組み合わせも自然に書けます。まずは上の形を手で動かして、宣言・return・受け取りの3つが対応している感覚をつかみましょう。
3. 実行結果を見てみよう
前の節で作成したcalc(10, 4)は、合計(14)と差分(6)の2つをこの順番で返します。戻り値は左から順に変数へ入るため、total, delta := calc(10, 4)と書けばtotalに14、deltaに6が格納されます。まずは標準出力へ表示される様子を確認しましょう。
合計: 14
差分: 6
この結果は、fmt.Println("合計:", total)とfmt.Println("差分:", delta)を順に呼び出しているためです。戻り値の並び順はそのまま意味に直結します。もし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() {
fmt.Println(calc(10, 4)) // 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言語では標準の文法として複数戻り値が使えるため、とても簡単で直感的です。
また、エラー処理との組み合わせでもよく使われます。たとえば「値」と「エラーオブジェクト」を同時に返すような場面です(※エラー処理は別の記事で扱います)。
まとめ
ここまで、Go言語の複数戻り値の基本から実用例まで、順番にやさしく解説してきました。改めて振り返ると、Go言語の複数戻り値は、ただ便利というだけでなく「読みやすいコードにつながる」「プログラムの意図を正確に表現できる」「初心者でも扱いやすい」という大きな特徴があります。多くのプログラミング言語では、値をひとつしか返せないため、配列に詰めたり、構造体を用意したり、外部の仕組みに頼ったりすることも少なくありません。しかし、Go言語では自然な文法で複数の値を返せるため、プログラムを書くときのストレスが少なく、シンプルな書き方で目的を達成できます。
また、複数戻り値は「計算結果と状態」「値とメッセージ」「商と余り」「成功したかどうか」といった、プログラムでよくある場面で役立ちます。初心者でも、難しい知識がなくても扱える仕組みなので、最初のうちにしっかり使い方を覚えておくと、コードを書くときの幅が大きく広がります。さらに、名前付き戻り値を使えば、変数の意味がはっきりし、読みやすいプログラムを作れるようになります。大規模なプログラムや、長い処理を書くときほど効果が高まり、後から見返すときにも役立ちます。
ここでは、最後に複数戻り値のポイントを意識した小さなサンプルをもうひとつ紹介します。「合計」と「平均」を同時に返す関数を作り、受け取った結果を表示する例です。「複数戻り値を使えば、ひとつの関数でまとめて処理できる」というイメージがつかみやすいサンプルです。
package main
import "fmt"
func calcScore(a int, b int, c int) (int, float64) {
total := a + b + c
avg := float64(total) / 3
return total, avg
}
func main() {
total, avg := calcScore(70, 80, 90)
fmt.Println("合計点:", total)
fmt.Println("平均点:", avg)
}
このように、「合計点」と「平均点」をひとつの関数でまとめて返せます。もし戻り値がひとつしか使えない言語なら、配列に入れたり、専用の構造体を作ったりと手間がかかります。しかしGo言語ならreturnに値を並べるだけで完了し、受け取る側も変数を並べるだけで自然に扱えます。こうしたシンプルさは「読みやすさ」「修正のしやすさ」「初心者でも混乱しにくい書き方」につながります。
さらに、使わない値をアンダースコアで受け取らないようにできる点も、Go言語らしい工夫です。「今回は合計点だけ使いたい」というときでも、不要な変数名を作らなくて済み、意図が分かりやすくなります。それによって、コードがすっきりし、作業ミスの防止にも役立ちます。
このように、複数戻り値はGo言語の大きな魅力のひとつであり、学び始めの段階から何度も出てくる要素です。今回の内容を押さえておけば、実際にプログラムを書いたとき、結果を扱う処理がぐっと楽になります。関数から複数の値を返せるという特徴を理解しておくことは、Go言語を使った開発で必ず役立つ場面があります。ぜひ小さな練習から始め、その便利さを実感してみてください。
生徒
「先生、複数戻り値って最初は難しそうに見えましたけど、実際のコードを見ると意外と簡単ですね。」
先生
「そうなんです。他の言語だと手間がかかる部分を、Go言語はとても自然な形で書けるんですよ。たとえば合計と差分、商と余り、名前と年齢など、日常的に便利な場面が多いのも特徴ですね。」
生徒
「アンダースコアを使って値を捨てられるのも、初心者には助かりますね。余計な変数が増えないから、頭が混乱しづらいです。」
先生
「まさにその通りです。複数戻り値を知っておくと、コードが短くなり、読みやすくなります。これからGo言語を使っていくなら、必ず役に立つ知識なので、ぜひたくさん練習してみてください。」
生徒
「はい!まずは自分で関数を作ってみます。今日の説明で、仕組みがよく分かりました!」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語の複数戻り値という仕組みは初心者でも使えるのですか?
Go言語の複数戻り値は初心者でもやさしく使える仕組みです。関数から二つの値を返すだけで、計算結果と状態や商と余りのように二つの情報をまとめて扱えるため、難しい特別な知識がなくても直感的に理解できます。配列や構造体を自分で作らなくても自然に値を取り出せるので、初めてGo言語にふれる人でも安心して利用できます。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!