定義するために名前を必要としない関数もあり得ます。これが無名関数です。この記事では、プログラミング言語Goにおいて無名関数を使用する方法を解説しています。
目次
無名関数とは
無名関数とは、定義するために名前を必要としない関数のことです。
プログラムの流れの中で定義し、すぐに呼び出すことができるのが特徴です。
無名関数の宣言(定義)方法
無名関数の宣言文は非常にシンプルで、通常の関数と構文は変わりません。
func() {
// 無名関数の処理
} ()
しかし、関数の流れの中で定義することができ、すぐに呼び出すことが可能です。
package main
import (
"fmt"
)
func main() {
func() {
fmt.Println("無名関数の中です") // 無名関数の中です
}()
}
無名関数を変数に代入する方法
無名関数は、変数に代入して変数名で呼び出すことができます。
以下は、無名関数を変数に代入したコード例です。
package main
import (
"fmt"
)
func main() {
v := func() { // 変数vに無名関数を代入する
fmt.Println("無名関数の中です")
}
}
無名関数の呼び出し
無名関数は変数に代入すると、その変数名で呼び出すことができます。また、即座に呼び出すことが可能です。
無名関数の即時呼び出し
即時呼び出しとは、宣言された関数が宣言後すぐに呼び出されることです。
以下は、無名関数の即時呼び出しのコード例です
package main
import (
"fmt"
)
func main() {
func() {
fmt.Println("無名関数の中です") // 無名関数の中です
}()
}
無名関数の名前による呼び出し
無名関数は、代入されている変数名を使って呼び出すこともできます。
そのためには、変数名を使ってその横に括弧を付けます。
package main
import (
"fmt"
)
func main() {
// 変数定義
test := func() {
fmt.Println("Hello, world!")
}
// 引数がある場合
sample := func(n int) {
fmt.Println(n)
}
// 呼び出し
test() // Hello, world!
sample(100) // 100
}
無名関数に引数を渡す
無名関数は通常の関数と同じように、任意の型の引数をいくつでも取ることができます。
無名関数で異なる引数を使用する例を見てみましょう。
package main
import (
"fmt"
)
func main() {
func(i int) {
fmt.Println(i)
}(100)
//出力結果: 100
}
無名関数を引数として渡す
無名関数は、関数の引数として渡すこともできます。
以下は、引数として渡される無名関数のコード例です。
package main
import (
"fmt"
)
func main() {
test := func(v string) {
fmt.Println(v)
}
func(v string, g func(v string)) {
test(v)
}("おはよう!", test)
//出力結果: "おはよう!"
}
関数から無名関数を返す
無名関数は、ある関数からreturnして返すこともできます。
ここでは、他の関数から無名関数を返す例を見てみましょう。
package main
import (
"fmt"
)
func main() {
sample := func() func(v int) {
f := func(v int) {
fmt.Println(v)
}
return f
}
test := sample()
test(100) // 100
}
無名関数のクロージャー
Golangの関数はクロージャーをサポートしています。
クロージャーは、関数がそのスコープ外の変数を参照するときに起こります。
以下はクロージャーを説明するコード例です。
package main
import (
"fmt"
)
func test() func() {
n := 0
return func() {
n++ // 1ずつ増やす
fmt.Println(n)
}
}
func main() {
func0 := test()
func1 := test()
func0() // 1
func1() // 1
func0() // 2
func1() // 2
func0() // 3
func1() // 3
}