【Go入門】戻り値が関数

Go
スポンサーリンク

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言語の関数定義において、戻り値に関数をとる方法について見て来ました。

定義した関数を呼び出すだけでなく、それ自体に丸括弧()をつけるなどをすることで、戻り値の関数を実行して処理結果を得ることができます。

Go
スポンサーリンク
CodeGraffitiをフォローする

タイトルとURLをコピーしました