久しぶりの更新です。最近は就活関係で色々と忙しくブログの更新ができていませんでした。。
しかし、プログラミングの勉強は欠かさずやっています。最近はずっとGo の勉強をしているので、勉強したことのアウトプットで学んだことを書いていきます。今回はgoでのクロージャです。
目次
①クロージャーとは
クロージャ(クロージャー、英語: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。 いくつかの言語ではラムダ式や無名関数にて利用可能な機能・概念である。 引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。
ウィキペディア
うん〜硬い説明だとしっくりこないですね。
よく言われる簡単な説明としては、関数とその関数が定義された状態をセットにした特殊なオブジェクトみたいな説明をよく見かけます。
イメージとしては関数がもう一つの関数を含んでいるような感じで、二つの関数で一個のセットになっています。(二つ以上の関数を含んでいることもあるかも?)
セットになることによってこの二つの関数間で結果や、変数を共有することができるようになります。
さらに、クロージャのメリットとして、オブジェクトの変数やメソッドを容易に変更できないようにカプセル化する役目もあり、より安全にプログラムを組むことができるようになります 。
②goでのクロージャ
ではgoでのクロージャの一例をあげています。
今回は、円の面積を求める公式をgoのクロージャを使って出力したいと思います。
package main import ( "fmt" ) func circleArea(pi float64) func(radious float64) float64 { return func(radious float64) float64 { return pi * radious* radious } } func main() { c1 := circleArea(3) fmt.Println(c1(2)) / 12 c2 := circleArea(3.14) fmt.Println(c2(2)) / 12.56 }
上記のコードの説明をします。
まず、goではmain関数の中が実行されるので、c1へcircleArea関数に引数3を持たせた状態を代入します。するとcircleArea関数のpiの引数に3が渡されます。
そしてクロージャでは、二つの関数間で変数を共有することができるので、circleArea内にある、無名関数内のpiに3が代入されている状態になっています。
この状態で、main関数の2行目のfmt.Println(c1(2))を出力することにより、circleArea関数内の戻り値の関数の引数radiousに半径2の値が入ることで、
3*2*2で12が出力されます。
c2も同じように処理が走り、引数によってそれぞれの円の面積を求めることができます。
今回の例だと、一つの関数で2つの引数を一気に渡すような関数を作れば良いと考えられますが、もっと複雑な関数を作成する際は、関数を分けることによってスケールしやすくなったり、逆に処理を分割して考えるこで、より可読性が上がるといったようなメリットもあります。
まとめ
今回はgolangのクロージャーについて書きました。
現在goに力を入れて勉強していくので、勉強したことをどんどんアウトプットしていきたいと考えております。
この記事へのコメントはありません。