returnの概要
関数の戻り値 Goの予約語 | ||
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
を使うことで早期終了が可能。 defer
はreturn
の後に実行される。- 過度な名前付き戻り値の使用は可読性を下げるため、適切に使う。