Go言語のreturnを使って関数の戻り値を制御する方法についてわかりやすく解説

スポンサーリンク
スポンサーリンク

returnの概要

関数の戻り値 Goの予約語

return

概要returnは、関数の実行を終了し、指定した値を呼び出し元に返すためのキーワードです。

  • 関数の結果を呼び出し元に渡す。
  • 複数の値を返すことが可能。
  • 名前付き戻り値を定義すると、明示的に変数を指定せずにreturnできる。
  • returnが実行されると、関数の処理は即座に終了する。

基本的なreturnの使い方

関数から単一の値を返す基本的な例です。

package main

import "fmt"

// add 関数: 2つの整数を加算して結果を返す
func add(a int, b int) int {
    return a + b
}

func main() {
    result := add(3, 5)
    fmt.Println("加算結果:", result)
}

解説:

  • return a + b によって、加算した値を呼び出し元に返す。
  • 戻り値の型はintとして定義されている。

実行結果:

加算結果: 8

複数の値を返す

Goでは、関数から複数の値を返すことが可能です。

package main

import "fmt"

// div 関数: 割り算の商と余りを返す
func div(a int, b int) (int, int) {
    return a / b, a % b
}

func main() {
    quotient, remainder := div(10, 3)
    fmt.Println("商:", quotient, "余り:", remainder)
}

解説:

  • return a / b, a % b により、2つの整数を同時に返している。
  • 呼び出し元では、複数の変数に代入して結果を取得できる。

実行結果:

商: 3 余り: 1

名前付き戻り値

戻り値に名前を付けることで、明示的なreturnの記述を省略できます。

package main

import "fmt"

// multiply 関数: 2つの整数を掛け算する
func multiply(a int, b int) (result int) {
    result = a * b
    return // 明示的に result を指定しなくてもOK
}

func main() {
    fmt.Println("掛け算結果:", multiply(4, 5))
}

解説:

  • 関数の戻り値としてresult intを定義。
  • 戻り値変数resultを関数内で直接代入。
  • return時に値を指定しなくても、resultの値が返される。

実行結果:

掛け算結果: 20

returnを使った早期終了

関数の途中で条件を満たした場合に処理を終了するためにreturnを使用できます。

package main

import "fmt"

// checkPositive 関数: 正の数かどうか判定
func checkPositive(n int) string {
    if n < 0 {
        return "負の数です"
    }
    return "正の数です"
}

func main() {
    fmt.Println(checkPositive(5))
    fmt.Println(checkPositive(-2))
}

解説:

  • if n < 0 の条件が満たされた場合、"負の数です" を返して関数が終了する。
  • 条件に該当しない場合は、"正の数です" を返す。

実行結果:

正の数です
負の数です

deferとreturnの関係

deferは、関数のreturn実行後に処理されるため、リソースの解放などに利用されます。

package main

import "fmt"

func example() {
    defer fmt.Println("関数終了")
    fmt.Println("処理中...")
    return
}

func main() {
    example()
}

解説:

  • deferを使うと、関数のreturn後に実行される。
  • この例では、"処理中..."の後にreturnで関数が終了するが、"関数終了"が最後に出力される。

実行結果:

処理中...
関数終了

注意事項

  • returnが実行されると関数は即座に終了する: その後のコードは実行されない。
  • 複数の値を返すことが可能: Goはreturn 値1, 値2のように複数の戻り値をサポートしている。
  • 名前付き戻り値は使いすぎに注意: コードの可読性が下がる場合があるため、適切な場面で使用する。
  • deferはreturnの後に実行される: リソースの解放やログ出力に活用できる。

よくある質問

Q: returnを使わない場合、関数の戻り値はどうなりますか?
A: 戻り値が定義されている関数でreturnを省略すると、ゼロ値(数値なら0、文字列なら""、ポインタならnil)が返されます。
Q: 名前付き戻り値はどんなときに使うべきですか?
A: 変数を明示的に初期化せずに関数内で操作したい場合や、戻り値の意味を明確にしたい場合に便利です。ただし、過度な使用はコードの可読性を損なうため注意が必要です。
Q: Goでは関数の戻り値を変更できますか?
A: Goの関数は値渡しがデフォルトですが、ポインタを使うことで関数内で値を変更することができます。
Q: returnの後にコードを書くとどうなりますか?
A: returnが実行されると関数が即座に終了するため、returnの後のコードは実行されません。
Q: returnとdeferの実行順は?
A: returnが実行されると、まず戻り値が設定され、その後にdeferが実行されます。

まとめ

  • returnは関数の実行を終了し、値を呼び出し元に返す。
  • Goでは複数の値を返すことが可能。
  • 名前付き戻り値を使うと、return時に値を指定しなくても済む。
  • 関数の途中でreturnを使うことで早期終了が可能。
  • deferreturnの後に実行される。
  • 過度な名前付き戻り値の使用は可読性を下げるため、適切に使う。