golang 無名関数とは 使い方と注意点について
今回はgolangの無名関数について解説していきます。
無名関数とは
無名関数とはその名の通り名前を持たない関数です。
無名関数は関数を直接変数に代入したり、引数として他の関数に渡したり、直接実行することができます。
無名関数の使い方
無名関数の具体的な使い方を見てみましょう。
以下のようなコードを書くことで無名関数を変数に代入してから実行することができます。
f := func() {
fmt.Println("Hello, World!")
}
f()
変数fにfunc()を代入することで、fは関数となります。このfを他の関数と同様に呼ぶことで実行することができます。
このコードの実行結果はHello, World!が出力されます。
次に無名関数を直接実行する方法です。
func() {
fmt.Println("Direct call")
}()
今回は変数に代入していないため、()と記述するだけで実行することができます。
このコードの実行結果はDirect callが出力されます。
また、無名関数は他の関数の引数として渡すことができ、コールバック関数やハンドラとして利用されます。
func process(f func(string)) {
f("test")
}
process(func(s string) {
fmt.Println(s)
})
上記コードのprocess関数は、引数としてfを受け取ります。
このfは、func(string)型の関数です。process関数の中で、このf関数が"test"という文字列を引数として呼び出されます。
次にprocess関数に無名関数を引数として渡しています。この無名関数はprocess関数から文字列"test"を受け取り、それをコンソールに出力します。
クロージャと無名関数
無名関数は外部の変数をキャプチャし、その変数にアクセスできるクロージャを形成します。
add := func(x int) func(int) int {
return func(y int) int {
return x + y
}
}
add5 := add(5)
result := add5(6)
fmt.Println(result)
上記コードではadd関数は無名関数を返し、5が入っているxをキャプチャします。返された関数はyを受け取り、x + yを計算します。よって出力結果は11となります。
golangの案件を探すならクラウドワークス テック
無名関数の注意点
スコープと変数キャプチャ
無名関数は外部の変数をキャプチャすることができますが、外部変数の値が変更されると、無名関数内のキャプチャされた変数の値も影響を受けてしまいます。
x := 10
f := func() {
fmt.Println(x)
}
x = 20
f()
この実行結果は20となります。
無名関数はゴルーチンと組み合わせて使用することが多いため、基本的にはデータへのアクセスやパフォーマンスには注意が必要です。
例えば、各ゴルーチンに無名関数を渡すと、関数の各インスタンスに対するメモリオーバーヘッドが発生する場合もあります。
無名関数の注意点というよりはゴルーチン実装時に気を付けることを意識すれば無名関数のリスクもケアすることができます。
golangをもっと詳しくなりたい方に
初めてのGo言語
Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。
詳解Go言語Webアプリケーション開発
こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。
以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。