なぜ sync.WaitGroup メソッドをポインタではなく値で呼び出すことができるのですか?
sync.WaitGroup のドキュメントでは、そのメソッドには*sync.WaitGroup レシーバーでは、タイプ sync.WaitGroup の値に対してこれらのメソッドを呼び出すことができます。これは、すべての sync.WaitGroup メソッドにポインター レシーバーがあるためです。つまり、メソッドが呼び出されたときにコンパイラーが値をポインターに自動的に変換します。
sync.WaitGroup の空のメソッド セット
sync.WaitGroup の実際のメソッド セットは空です。これを確認するには、リフレクションを使用します。
wg := sync.WaitGroup{} fmt.Println(reflect.TypeOf(wg).NumMethod()) // Output: 0
したがって、sync.WaitGroup 値に定義されているように見えるメソッドは、実際には *sync.WaitGroup.
値のポインター メソッドを呼び出すための省略表記
呼び出し時値に対するポインター メソッドの場合、コンパイラーはそれをその値へのポインターの呼び出しに変換します。例:var wg sync.WaitGroup wg.Add(1)は次と同等です:
(&wg).Add(1)Go の仕様では、変数がアドレス指定可能で、そのメソッド セットにメソッドが含まれている場合、そのメソッドをメソッド上で直接呼び出すと規定されています。変数は、その変数へのポインターで呼び出すための短縮形です。
関連質問
このトピックの詳細については、関連する質問を参照してください。以上がポインターだけでなく値に対して sync.WaitGroup メソッドを呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。