【Golang】クロージャーの使い道
2022年04月08日 7:42
Goのクロージャー(closure)が無名関数であり、外部から変数を参照できる仕組みであることを説明している記事は結構あると思います。ではいつ使われるのか、メリット等気になり調べてみました。クロージャーの仕組みは理解されている前提で進みます。もしクロージャーって何という方はこちら
クロージャーは定義と実行のタイミングがずれる性質があります。例としてはdeferやgoroutineなどでよく見かけます。
例えばクロージャ内でmap情報を保持すれば構造体を実装しなくても、簡易的な情報の保持ができます。
ただ、わかりづらくなるのと開発チームのレベル感にも左右される気がしてあまり実用的ではないように思います。
Go Playground
実行結果
実はデフォルト引数などでも使われるFunctional option patternでもoptionの設定時にクロージャーは使われています。
下記のようにServerの設定にFunctional Option Patternを使っていたとします。
クロージャーとして機能しているのは、WithHost
、WithPort
、WithTimeout
、WithMaxConn
になります。ローカル変数は使っていませんが、無名関数の引数のServerにWith...
関数の引数の値がセットされそのまま無名関数として返却しています。
各関数をNewの引数に取るとServer structのフィールドが設定され、optionのように動作させることができます。
長くなりましたが以上になります。goのクロージャーはイディオム的な書き方がほとんどだと思ったので仕組みを理解されていれば特に問題ないと思いました。Fuctional option patternsは割と混乱することも多いので一読されることをお勧めします。
Function closures
Goを学ぶときにつまずきやすいポイントFAQ
Golangのクロージャで何が便利なのか理解するためにRedisのようなKVS機能を作る
Golang Functional Options Pattern
Functional options for friendly APIs
Self-referential functions and the design of options
https://pkg.go.dev/os#example-MkdirTemp
診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。