WaitGroups リファレンスのポインターまたは変数
Sync パッケージは、待機グループを管理するための Add、Done、Wait などの関数を提供します。これらの関数を使用するときは、ポインターと変数の正しい使用法を理解することが重要です。
Add 関数と Wait 関数は両方とも、関数宣言で示されているように、待機グループへのポインターを使用して呼び出されます。待機グループの内部状態を変更するため、これは予期される動作です。
ただし、次のコード サンプルでは Done 関数が例外であるように見える場合があります。
var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait()
このコードでは、 Done 関数はポインタ変数 (&wg) を使用して呼び出されます。これは、Add や Wait の使用法とは異なるため、混乱を招く可能性があります。
説明は、Go で変数が関数にどのように渡されるかにあります。変数が引数として関数に渡されると、その値のコピーが作成されます。この場合、Done 関数が wg を使用して (& なしで) 直接呼び出された場合、ワーカー関数は待機グループのコピーを受け取ります。ワーカー関数内で行われた変更は、メインのゴルーチン内の元の待機グループ インスタンスには影響せず、同期の問題が発生します。
したがって、待機グループ (&wg) のアドレスを Done に渡す必要があります。これにより、ワーカー関数は元の待機グループ インスタンスに直接アクセスし、それに応じて内部状態を変更できるようになります。
これは、ポインター レシーバーと値レシーバーの違いも強調しています。囲碁で。レシーバー関数は、ポインター レシーバー (*WaitGroup) または値レシーバー (WaitGroup) として定義できます。ポインタ レシーバを使用すると、関数は基になる値を変更できます。一方、値レシーバは変数のコピーを作成し、関数が元の値に影響を与えることなく独自のコピーを操作できるようにします。
この特定のケースでは、次を使用する必要があります。 3 つの関数 (Add、Done、Wait) すべてのポインター レシーバー。これらはすべて待機グループの内部状態を変更する必要があるためです。 Done は例外のように見えますが、実際には、元の待機グループ インスタンスへの直接アクセスを提供するという同じ原則に従っています。
以上がGo の WaitGroup の Add、Done、および Wait 関数ではポインタまたは変数を使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。