ホームページ >バックエンド開発 >Golang >インライン関数が、その関数を含む関数だけではなく、すぐに呼び出されるのはなぜですか?

インライン関数が、その関数を含む関数だけではなく、すぐに呼び出されるのはなぜですか?

王林
王林転載
2024-02-06 08:06:031094ブラウズ

インライン関数が、その関数を含む関数だけではなく、すぐに呼び出されるのはなぜですか?

質問内容

構造体のフィールドに値を代入する場合。

リーリー

newFlagSet("configure") を呼び出すのと同じだと思います。このように書くことの利点は何ですか。

ソースコードを読む際の問題。なぜ彼がこれを書いたのかを知る必要があります。


正解


クイック検索、このコードはtailscale/tailscalecmdから来ています。 /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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。