なぜ sync.WaitGroup はポインター レシーバーなしで機能するのですか?
Go では、ゴルーチンの同期に sync.WaitGroup 型が使用されます。 Add、Done、Wait などの sync.WaitGroup のメソッドは、ポインター レシーバーを使用して定義されます。ただし、ポインター (*) を使用せずに sync.WaitGroup 値を宣言するのが一般的です。
次のスニペットを考えてみましょう:
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { wg.Add(1) go func() { fmt.Println("starting...") time.Sleep(1 * time.Second) fmt.Println("done....") wg.Done() }() wg.Wait() }
このコードでは、wg を sync.WaitGroup として宣言します。ポインター (*) のない値。これが可能なのは、Go では非ポインター値でポインター レシーバーの使用が許可されているためです。
内部では、Go は非ポインター値 (wg.Add(1) など) をポインター値に変換します。 (&wg.Add(1) など)。これにより、sync.WaitGroup のメソッドを非ポインター値で呼び出すことができます。
sync.WaitGroup のメソッド セットの反映
同期のメソッド セット。 WaitGroup はすべてのメソッドにポインター レシーバーがあるため、空です。これは、次のリフレクション コードによって確認されます。
wg := sync.WaitGroup{} fmt.Println(reflect.TypeOf(wg).NumMethod()) // Outputs 0
これは、sync.WaitGroup には、非ポインター値に対して直接呼び出すことができるメソッドがないことを意味します。
結論
Go では、ポインター (*) なしで sync.WaitGroup 値を宣言するのが一般的です。 Go では非ポインター値に対するポインター レシーバーの使用が許可されているため、これが可能になります。 sync.WaitGroup のメソッド セットは、すべてのメソッドにポインター レシーバーがあり、コンパイラーによって非ポインター値から自動的に変換されるため、空です。
以上がGo の sync.WaitGroup がポインターなしで機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。