関数クロージャにパラメータを渡す
Go の関数クロージャを使用すると、内部関数が外側の関数の変数にアクセスできます。ここで疑問が生じます: クロージャを使用する代わりに内部関数にパラメータを渡すのが望ましいのはどのような場合ですか?
最初の例では、パラメータであるチャネルを使用して匿名関数が作成されます。この関数は、チャネルに値を送信する前に短時間スリープします。 2 番目の例では、内部関数がクロージャとして作成され、外部関数からチャネル変数にアクセスします。
これら 2 つのアプローチのどちらを選択するかは、意図するユースケースによって異なります。各関数呼び出しが個別の値を受け取る必要がある場合は、パラメーターが推奨されます。これは、クロージャを作成する前にパラメータをカスタマイズできるため、関数がより大きな関数の一部として返される場合に便利です。
逆に、すべての関数呼び出しが同じ変数を共有する必要がある場合には、クロージャがより適しています。示されている例では、どちらのアプローチでも、最終的には遅延後にチャネルに値を送信するという同じ結果が得られます。ただし、クロージャにより、各ゴルーチンが同じ共有チャネル オブジェクトにアクセスすることが保証されます。
違いを示すために次の例を考えてみましょう:
for i := 0; i < 3; i++ { // Closure example: all calls share the same 'i' go func() { fmt.Println(i) }() // Parameter example: each call receives a copy of 'i' go func(v int) { fmt.Println(v) }(i) }
クロージャの例では、すべての関数呼び出しは print '3 ' i の値はゴルーチンが実行されるまでに変更されている可能性があるためです。パラメーターの例では、各呼び出しは関数の作成時からの「i」のコピーを受け取り、値「0」、「1」、および「2」が得られます。
最終的に、クロージャまたはパラメータは、特定の使用例と、外側の関数と内部関数の間で必要な変数の共有によって異なります。
以上がGo 関数でパラメータを渡すのとクロージャを使用するのはどちらの場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。