Go言語の関数を扱って来ましたが、これまでは関数名を与えて定義して来ました。
ここでは、関数名を与えないで定義する無名関数(Anonymous function)を見ていきましょう。
無名関数の定義
では、無名関数(Anonymous function)を定義して行きましょう。
無名関数は次のような形で定義します。
func() {
処理コード
}
func(引数名 型名) {
引数を用いた処理コード
}
定義の形はこの形ですが、関数名が無い以外は通常の関数と同じです。無名関数は引数をとることもできます。
無名関数の自己実行機能
それでは無名関数を具体的なコードで見ていきましょう。
ここでは、実行時の無名関数が自己実行される形でコードを書いてみようと思います。
package main
import "fmt"
func foo() {
fmt.Println("foo関数の処理です。")
}
func main() {
foo()
func() {
fmt.Println("無名関数の処理です。")
}()
func(x int) {
fmt.Println("無名関数の処理に用いた引数の値:", x)
}(2020)
}
foo()関数は、これまでの関数定義と同じですね。それをmain()関数で呼び出しています。
main()関数の中に無名関数を定義しています。引数の無いものと引数を用いたものを定義しています。
この無名関数の波括弧{}ブロックに続けて丸括弧()を記述しています。これが無名関数の自己実行機能です。他のプログラミング言語でも丸括弧を付けて実行することがあるのと同じような操作ですね。引数を用いるものは丸括弧に引数の値を代入しているのがわかります。
実行するとこうなります。
foo関数の処理です。
無名関数の処理です。
無名関数の処理に用いた引数の値: 2020
変数への無名関数の割り当て
上では、無名関数を即時に実行する形で定義しましたが、変数に割り当てて実行する形を見ていきましょう。
上のコードを修正して、次のように書いてみます。
package main
import "fmt"
func main() {
f := func() {
fmt.Println("無名関数の処理です。")
}
f()
g := func(x int) {
fmt.Println("無名関数の処理に用いた引数の値:", x)
}
g(2020)
}
同じ無名関数を使っています。
こちらは、それぞれ変数に省略宣言を使って無名関数を代入しています。
割り当てた変数に丸括弧()を記述することで実行処理になります。引数が必要なものは合わせて記述して実行します。
実行してみます。
無名関数の処理です。
無名関数の処理に用いた引数の値: 2020
無名関数が実行できてるのがわかります。
他の言語でもこのように扱うことのを見ることができるので、理解はしやすいと思います。
最後に
ここでは、Go言語の無名関数についてみてきました。
他のプログラミング言語と同様に、関数名を指定せずに定義します。
無名関数を実行する(呼び出す)には、無名関数に続けて丸括弧を付けて実行させるか、変数に無名関数を割り当てて、変数に続けて丸括弧を記述して実行します。
Pythonでは無名関数はlambdaを使うので、ちょっとGoとは使い方が違いますね。