Go言語のreturnの使い方!早期リターンでコードをすっきりさせよう
生徒
「Go言語のreturnって何ですか?どうやって使えばいいんですか?」
先生
「Go言語のreturnは、関数の中で値を返したり、処理を終わらせたりするために使います。とても重要な命令ですよ。」
生徒
「値を返すってどういうことですか?あと、処理を終わらせるって?」
先生
「それでは、具体的な使い方と一緒に、早期リターンという便利な書き方も紹介していきましょう!」
1. Go言語のreturn文とは?
Go言語のreturn文は、関数という小さな処理のまとまりから結果を呼び出し元へ返したり、そこで処理を打ち切ったりするときに使われる基本的で大切な仕組みです。プログラムが「どのタイミングで、どんな値を返すのか」をはっきり示す役割があります。
たとえば「計算した結果を返す」「条件がそろわなければ途中で処理をやめる」といった場面で活用されます。特に初心者がつまずきやすいのが、関数の動きとreturn文の関係ですが、ひとつひとつ順番に理解すると自然と読み書きできるようになります。
簡単な例として、ひとことメッセージを返すだけの関数を見てみましょう。
func message() string {
return "こんにちは!"
}
この関数は、呼び出されたときに必ず「こんにちは!」という文字列を返します。関数がどんな値を返すのかが明確で、プログラム全体の流れも追いやすくなります。
このように、関数は「特定の処理をまとめて必要なときに使いまわすための仕組み」であり、returnはその結果を呼び出し側へ届ける大切な役割を持っています。
2. 基本的なreturnの使い方
ここでは、Go言語で最もよく使われる「計算して値を返す」という基本パターンを確認してみましょう。return文は、関数の中で計算した結果を呼び出し元へ送り返す役割を持っており、プログラムの流れを理解する上でとても大切です。
まずは2つの数を受け取り、その合計値を返すシンプルな関数を見てみます。プログラミング未経験の人でも読みやすいように、できるだけ処理を小さくしています。
package main
import "fmt"
func add(a int, b int) int {
// a と b を足した結果を result に入れる
result := a + b
// 計算結果を呼び出し元へ返す
return result
}
func main() {
sum := add(3, 5)
fmt.Println("合計は", sum)
}
この例では、add関数が受け取った数値を足し合わせ、そのままreturnによって戻しています。戻ってきた値はmain関数のsumに入り、そのあと画面に表示されます。returnのおかげで、「どこで計算した値がどこへ渡るのか」がはっきりして、プログラムの流れが追いやすくなるのがポイントです。
合計は 8
このように、return文は「関数の結果をはっきり伝える」ための基本的で重要な仕組みです。小さな例でも、returnの動きを意識して読むことで、今後より複雑な処理を理解しやすくなっていきます。
3. 早期リターン(early return)とは?
早期リターンとは、ある条件を満たしたときに、関数の途中でreturnして処理を終わらせるテクニックです。これにより、無駄なネスト(入れ子)を避けて、コードを読みやすくできます。
たとえば、次のようなコードを見てみましょう。
package main
import "fmt"
func greet(name string) {
if name == "" {
fmt.Println("名前が入力されていません")
return
}
fmt.Println("こんにちは、", name, "さん!")
}
func main() {
greet("") // 空の文字列を渡す
greet("タロウ") // 名前を渡す
}
名前が入力されていません
こんにちは、 タロウ さん!
このコードでは、nameが空文字(つまり名前がない状態)のとき、すぐにreturnして「名前が入力されていません」と表示して終わります。
条件に当てはまらないときは、次の処理(「こんにちは」のメッセージ)に進みます。
4. returnを使わないとどうなる?
もしreturnを使わないで同じことをしようとすると、コードが深くネストされてしまって読みづらくなります。
func greet(name string) {
if name == "" {
fmt.Println("名前が入力されていません")
} else {
fmt.Println("こんにちは、", name, "さん!")
}
}
こうしたelseによるネストは、処理が多くなるととても読みにくくなる原因になります。早期リターンを使うことで、無駄なelseを減らしてコードをすっきりさせられるのです。
5. returnで複数の値を返すこともできる
Go言語では、関数から複数の値を返すこともできます。これは他の多くのプログラミング言語にはない特徴です。
例えば、割り算の結果と余りの両方を返す関数を作れます。
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(10, 3)
fmt.Println("商:", q)
fmt.Println("余り:", r)
}
商: 3
余り: 1
(int, int)のように2つの戻り値の型を指定することで、returnで2つの値をまとめて返すことができます。受け取るときも、カンマで区切って2つの変数に入れます。
6. 関数の最後にreturnがある理由
関数の処理が終わったら、何かしらの結果を返す必要がある場合があります。そのため、最後にreturnを書くのが基本です。
逆に、何も返さない関数(戻り値がない関数)の場合は、returnを書かなくても動きますが、処理を途中でやめたいときに使うこともあります。
たとえば次のように書くと、値は返していませんがreturnによって途中で終了しています。
func checkAge(age int) {
if age < 0 {
fmt.Println("年齢が不正です")
return
}
fmt.Println("年齢は", age, "歳です")
}
7. returnと「何もしない関数」の使い方
「条件を満たさなければ何もせずに戻る」という考え方も、Go言語ではよく使われます。
これは、例えばエラーチェックのときや、設定が正しくないときなどに使われます。
func setup(config string) {
if config == "" {
return
}
fmt.Println("設定:", config)
}
このように、特に何も表示せずにreturnで静かに抜けることも可能です。
まとめ
Go言語のreturn文について振り返ってみると、関数の中で処理を終了させるための基本的な仕組みでありながら、実際の開発ではとても幅広い場面で使われる重要な構文だと改めて感じられます。特にreturnは単に値を返すだけではなく、関数全体の流れを整理したり、無駄なネストをなくして読みやすいコードを実現したりするための柱のような存在です。記事の中で学んだ早期リターンという考え方は、条件分岐が多くなる関数で威力を発揮し、コードの意図をより明確にしてくれます。実務でも保守性を高める上で非常に役立つため、初学者のうちから身につけておくと後々困る場面がぐっと減るでしょう。
また、Go言語ならではの特徴として、returnで複数の値を返せる点も印象的です。商と余りを同時に返すような使い方はもちろんのこと、エラー処理でも結果とエラーの両方を返すのが一般的で、Goの記述スタイルを形成しているともいえます。複数の戻り値を自然に扱えるため、処理を分かりやすく分離でき、呼び出し側のコードもすっきり整います。関数設計に自由度があり、エラー制御まで一貫してreturnで行えるため、Go特有の明快なスタイルがそのまま表れています。
さらに、returnを使って途中終了するパターンは、実際のプログラムの中でも判断分岐が複雑になるタイミングで非常に役に立ちます。年齢入力の例や設定チェックの例のように、値が正しくなければ静かに終了させたい状況は多く、そのときに無用な処理を進めないための安全装置としてreturnが機能します。プログラム全体の安全性を高めることにもつながり、単純な文法以上の意味を持つことが理解できたはずです。
実際の開発では、returnの使い方ひとつでコードの読み手の印象が変わります。特に関数冒頭にチェック処理を書き、条件に合わなければすぐにreturnしてしまう早期リターンの書き方は、理由が明確で、読み手が迷わずに先を追えるため、経験者ほど積極的に取り入れる傾向があります。Go言語はシンプルな構文を重視しているため、このスタイルが非常に自然に馴染んでいると言えます。
まとめとして意識しておきたいのは、returnが「値を返すための構文」という範囲を超えて、関数の流れ全体を整理する道具でもあるということです。早期リターンによって無駄な条件分岐を避け、複数戻り値によって処理の結果を丁寧に返し、静かに終了させるreturnを使って安全に関数の役割を終える。これらすべてを組み合わせることで、読みやすく保守しやすいGoらしいコードが形作られます。関数の中で「ここで処理を終えたい」と思った瞬間にreturnが活躍するため、意識していくほど自然に最適なタイミングでreturnを置けるようになるでしょう。
サンプルプログラムでふりかえり
最後にReturnの考え方をふりかえれる小さなプログラムをひとつ載せておきます。条件チェック、複数戻り値、早期リターンの要素がすべてまとまっているため、練習用としても扱いやすい内容です。
package main
import "fmt"
func checkAndDivide(a int, b int) (int, int, bool) {
if b == 0 {
return 0, 0, false
}
quotient := a / b
remainder := a % b
return quotient, remainder, true
}
func main() {
q, r, ok := checkAndDivide(15, 0)
if !ok {
fmt.Println("割り算できませんでした")
return
}
fmt.Println("商:", q, "余り:", r)
}
このようにreturnは、状況に応じて値を返し、処理の分岐を整理し、関数の役割を明確にしてくれる中心的な働きを持っています。特に戻り値に成功フラグを持たせる書き方はGo言語で頻繁に登場するため、今回の理解を土台に今後さらに応用的なコードに触れると、自然に使いこなせるようになるはずです。
生徒
「returnってただ値を返すだけじゃなくて、関数の流れを整えるためにも使われているんですね。早期リターンがすごく便利だと改めてわかりました。」
先生
「その通りです。Goはシンプルで読みやすいコードを大事にしているので、returnがうまく機能する場面が非常に多いです。条件に合わなければすぐに戻る、複数の値を返す、そして静かに処理を終える。どれもGoの流儀に合った大事な使い方ですよ。」
生徒
「複数戻り値も思ったより自然に使えるんですね。エラー処理でもよく見るって聞いたので、これからの実装でも意識してみます。」
先生
「どんどん慣れていきましょう。returnは基本だけど非常に奥が深い構文です。今回学んだことを丁寧に積み重ねていけば、きっと読みやすく安全なGoコードを書けるようになりますよ。」