【Golang】クロージャーの使い道

0

2022年04月08日 7:42

Goのクロージャー(closure)が無名関数であり、外部から変数を参照できる仕組みであることを説明している記事は結構あると思います。ではいつ使われるのか、メリット等気になり調べてみました。クロージャーの仕組みは理解されている前提で進みます。もしクロージャーって何という方はこちら

遅延実行されるとき

クロージャーは定義と実行のタイミングがずれる性質があります。例としてはdeferやgoroutineなどでよく見かけます。
img

構造体を作るほどでもない時

例えばクロージャ内でmap情報を保持すれば構造体を実装しなくても、簡易的な情報の保持ができます。
ただ、わかりづらくなるのと開発チームのレベル感にも左右される気がしてあまり実用的ではないように思います。
Go Playground
img
実行結果
img

Functional Option Pattern

実はデフォルト引数などでも使われるFunctional option patternでもoptionの設定時にクロージャーは使われています。
下記のようにServerの設定にFunctional Option Patternを使っていたとします。
img
img

クロージャーとして機能しているのは、WithHostWithPortWithTimeoutWithMaxConnになります。ローカル変数は使っていませんが、無名関数の引数のServerにWith...関数の引数の値がセットされそのまま無名関数として返却しています。
img

各関数をNewの引数に取るとServer structのフィールドが設定され、optionのように動作させることができます。
img

まとめ

長くなりましたが以上になります。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

# Go
0

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。