golang クロージャとは 使い方、注意点について解説
今回はgolangにおけるクロージャについて解説していきます。
クロージャとは
クロージャは、特定の関数内で定義された関数であり、その定義された関数が存在するスコープのローカル変数にアクセスし、操作することができます。
クロージャの使い方
まずGo言語には無名関数という機能があります。
無名関数は以下のplus変数に代入されているfunc()のように名前付きの識別子を持たない関数のことを言います。
func main() {
a := 0
plus := func() int {
a++
return a
}
fmt.Println(plus())
}
この実行結果は1です。
クロージャはこの無名関数を利用して作成します。
先ほどのコードでは変数aを他のコードで変更させてしまう危険性があります。クロージャはそれを排除するために関数作成時点の変数を閉じ込めることができます。
少し分かりにくいので実際にコードを見てみましょう。
func plus() (func() int) {
a := 0
return func() int {
a++
return a
}
}
func main() {
b := plus()
fmt.Println(b())
fmt.Println(b())
fmt.Println(b())
}
この実行結果は1 2 3
このように一回目のb()関数の実行が終わった後でもplus()関数のローカル変数であるaの値は保持され続けて、aの値が増加していきます。
クロージャは難易度が少し高めなわりには現場レベルではあまり使用されることは多くないので、こういうものがあるくらいで抑えておくとよいです。
golangの案件を探すならクラウドワークス テック
クロージャの注意点
クロージャは非常に便利な機能ではありますが、注意しておかなければいけないことが多々あります。
スコープ外の変数の変更
クロージャ内で外部のスコープの変数を変更すると、その変更は外部のスコープにも反映されるため扱いには注意が必要です。
並行処理での安全性
クロージャが複数のゴルーチンからアクセスされる場合、共有される変数へのアクセスが競合する可能性があります。
この事象を防ぐためにはをミューテックスなどを使用して防ぐ必要があります。
メモリリークのリスク
クロージャが大きなメモリを消費するオブジェクトを参照している場合は注意が必要です。
クロージャが生きている間はそのメモリが解放されないため、メモリリークに繋がるリスクがあります。
golangをもっと詳しくなりたい方に
初めてのGo言語
Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。
詳解Go言語Webアプリケーション開発
こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。
以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。