
関数名の無い無名関数って何?どういう場面で使用されるんですか?
Go言語だけでなく、他のプログラミング言語でも使用されている関数名の無い無名関数についてお伝えしていきます。
私自身、無名関数の存在の必要性に疑問を持ったことがありますので、同じような悩みを抱えている方に、少しでもお役に立てるようにしていきますね。
あと、Go言語の関数の基本的なことは別の記事で紹介していますので参考にしてください。
【Go言語の関数】無名関数とは?
無名関数は関数名の無い関数で、関数名のある関数との違いは関数名のありなしだけで機能的には一緒です。
では、なんでわざわざ無名関数が存在するのでしょうか?

無名関数が無いと仮定した場合の、現役ITエンジニアの声を聞いてみましょう。

一回しか使わない関数にわざわざ関数名つける必要ある?

あー関数名が被っちゃたよ…違う関数名にしないと…一回しか使わない関数なのに。
あくまでも、私の想像の範囲ですがあながち間違ってはいないでしょう。

私みたいに英語が得意でないと、関数名を付けるのも地味に時間がかかります…
あと、関数は引数や戻り値にも関数を与えることができます。
この時に活用されるのが無名関数です。
他の人のプログラムコードを拝見する時に見かけることが多いので、この機会に覚えておきましょう。
Go言語での無名関数
関数名のある関数は関数の外に記述していましたが、無名関数は引数や戻り値、すぐに実行したい関数に用いられるので関数内で記述されることが多い関数です。
それでは、無名関数の記述例を見ていきましょう。
Go言語での無名関数の基本
// 無名関数の基本形
package main
func main() {
変数名 := func (引数 型) 戻り値の型 {
// 処理する内容
}
}
記述自体は関数名が無いだけです。
それでは、足し算を例にコードを書いてみましょう。
// 無名関数で足し算
package main
import "fmt"
func main() {
add := func(x, y int) int {
return x + y
}
result := add(1, 2)
fmt.Println(result)
}
// 出力結果
$ go run main.go
3
ポイントとして、変数add
に関数が代入されています。
関数の実行には 変数add
を利用して引数を渡し、戻り値を 変数result
に代入されている流れです。
無名関数を即実行する
先程は、変数add
に関数を代入して実行しましたが、無名関数を即実行する方法もあります。
// 直接、変数に無名関数と引数を渡して実行する方法
package main
import "fmt"
func main() {
result2 := func(x, y int) int {
return x + y
}(1, 2) // ここで引数を渡す
fmt.Println(result2)
}
// 出力結果
$ go run main.go
3
一回だけ実行される関数であれば、変数をひとつ減らしてコードも1行減らせるので便利な方法です。
Go言語での無名関数の使いどころ
Go言語だけでなく、他のプログラミング言語でも…
- 関数を戻り値として返す関数
- 関数を引数に取る関数
があります。
ここで多く使用されるのが、無名関数です。

私もそうでしたが、プログラミング初心者が悩むポイントのひとつです。
では、実際にコードを見ていきましょう。
関数を戻り値として返す関数
// 関数を戻り値として返す関数
package main
import "fmt"
// 返り値の型としてfunc()
func ReturnFunc() func() {
// 戻り値に無名関数を使用
return func() {
fmt.Println("関数の中の関数です。")
}
}
func main() {
// 変数に戻り値の関数を代入する
f := ReturnFunc()
// 戻り値の関数を実行する
f()
}
// 出力結果
$ go run main.go
関数の中の関数です。
変数f
に戻り値の関数が代入され、 f()
で実行されます。
関数を引数に取る関数
// 関数を引数に取る関数
package main
import "fmt"
// 引数で受け取った関数を実行する
func CallFunc(f func()) { // 引数に引数名f 型にfunc()
f() // 引数の関数を実行
}
func main() {
// CallFuncは引数が関数なので関数を与える
CallFunc(func() {
fmt.Println("引数の関数が実行されました。")
})
}
// 出力結果
$ go run main.go
引数の関数が実行されました。
関数CallFunc
は引数に関数を与える関数なので、関数CallFunc
を実行する時に無名関数で関数を与えています。
【まとめ】Go言語の無名関数について
今回は、Go言語の無名関数についてお伝えしてきました。
今回の内容を一回で覚えるのは難しいと思いますが、これからプログラムコードを書いていくと無名関数を使用する場面があることでしょう。
実際にコードで書くことで理解が深まっていくはずです。
まずは、無名関数という機能があることを覚えておきましょう。
覚えておくだけで、先輩が書いたコードを拝見する時に役立つはずですからね。
comment