Go言語の関数に関わることについて見て来ていますが、ここでは、戻り値に関数をとる場合について見ていこうと思います。
戻り値を関数にとる関数定義
関数の返り値(戻り値)については、これまで扱ったところでは処理の値や式などを返していましたが、関数(無名関数)をとることもできます。
次のような形で、関数を定義します。
func 関数名() func() 型名 {
return func() 型名 {
return処理
}
}
関数が連続して表示されるので、ちょっと見慣れて無いですけど、これまでの関数の定義に、返り値の型名を指定するパターンの形と同じであるというのはわかると思います。
簡単なコードで書いてみましょう。
package main
import "fmt"
func foo() func() int {
return func() int {
return 2020
}
}
func main() {
x := foo()
fmt.Printf("%T\n", x)
y := x()
fmt.Println(y)
}
関数名foo()の戻り値に、int型の関数を返すように定義しています。returnの中でこの関数の定義をしています。
main関数でfoo()を呼び出していますが、xに代入してPrintf()で型を確認しています。(実行結果を見るとわかりますが、func() intとなります。)
このままだと、xはfoo()を呼び出しただけで、戻り値の関数を実行できていない状態です。
なので、ここでx()と丸括弧をつけることで戻り値の関数を実行します。これを、yに代入してPrintln()で出力しています。
実行するとこうなります。
func() int
2020
最終的に、戻り値の関数を実行した値が出力されているのがわかります。
これは次のように実行することもできます。
package main
import "fmt"
func foo() func() int {
return func() int {
return 2020
}
}
func main() {
x := foo()
fmt.Println(x())
}
ここでは、foo()を呼び出して代入したxを、そのまま丸括弧()をつけてPrintln()で出力しています。型名の出力は省略しました。
実行結果は2020で同じです。
また、これを次のようにして実行することもできます。
package main
import "fmt"
func foo() func() int {
return func() int {
return 2020
}
}
func main() {
fmt.Println(foo()())
}
これは、foo()関数を呼び出すと同時に、丸括弧を付けて直接実行する形になっています。
こちらも結果はもちろん同じです。
最後に
ここではGo言語の関数定義において、戻り値に関数をとる方法について見て来ました。
定義した関数を呼び出すだけでなく、それ自体に丸括弧()をつけるなどをすることで、戻り値の関数を実行して処理結果を得ることができます。