Golangの無名関数について基本事項から具体的な使い方まで総まとめ

Golang

定義するために名前を必要としない関数もあり得ます。これが無名関数です。この記事では、プログラミング言語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
}

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