sync.WaitGroup のメソッド セット
sync.WaitGroup は、ゴルーチンのコレクションが完了するのを待機できる同期プリミティブです。 。ドキュメントでは、Add、Done、および Wait メソッドにはポインター レシーバーが必要であることが示されていますが、ポインター以外の値に対しても使用できます。これはどのようにして可能ですか?
その秘密は、sync.WaitGroup の空のメソッド セットにあります。これは、sync.WaitGroup のすべてのメソッドがポインター レシーバーであることを意味します。
var wg sync.WaitGroup
など、sync.WaitGroup 型の値を作成すると、実際には sync.WaitGroup 構造体へのポインターが作成されます。このポインタは、wg 変数のメソッドを呼び出すときに自動的に逆参照されます。たとえば、次のコードは正常にコンパイルされます。
wg.Add(1) wg.Done() wg.Wait()
Go コンパイラーは、メソッドを呼び出す前に、wg を sync.WaitGroup へのポインターに暗黙的に変換します。この動作は Go 言語仕様で定義されています。
x がアドレス指定可能で、&x のメソッド セットに m が含まれる場合、x.m() は (&x).m() の短縮形です。
したがって、非ポインター値がアドレス指定可能な場合は、その値に対するポインター レシーバーを持つメソッドを呼び出すことができます。 Go では、ポインター以外の値は常にアドレス指定可能です。
以上が非ポインター値に対して sync.WaitGroup メソッドを呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。