構造体のフィールドに値を代入する場合。
リーリーnewFlagSet("configure") を呼び出すのと同じだと思います。このように書くことの利点は何ですか。
ソースコードを読む際の問題。なぜ彼がこれを書いたのかを知る必要があります。
クイック検索、このコードはtailscale/tailscale
、cmdから来ています。 /tailscale/cli/configure.go#var configureCmd = &ffcli.Command{}
このコードは、 関数リテラル (匿名関数) を使用し、それをすぐに呼び出します。
これは、即時呼び出し関数式 (IIFE) と呼ばれます。これは JavaScript などの言語でより一般的ですが、Go でも同様に役立ちます。
Go では、IIFE を使用して、値を生成するロジックの部分を分離し、周囲の名前空間を汚染しない変数のスコープ環境を作成できます。
匿名関数 (この場合は fs
) で使用される変数は、周囲のコードにエスケープされません。これにより、変数は必要な場合にのみ存在するため、コードの推論が容易になります。
FlagSet: newFlagSet("configure") は true ですが、
は FlagSet: (func() *flag.FlagSet { fs := newFlagSet("configure"); return fs と同等です。 })()
、2 番目の形式には次のような利点があります:
newFlagSet("configure")
への今後の変更でより複雑な操作や計算が必要な場合、これらの変更は configureCmd
構造を変更せずに匿名関数に簡単に組み込むことができます。 テールスケール コードを見ると、その特定の IIFE の使用はその 1 つのインスタンスに限定されているようです。
以上がインライン関数が、その関数を含む関数だけではなく、すぐに呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。