ホームページ >バックエンド開発 >Golang >ポインターだけでなく値に対して sync.WaitGroup メソッドを呼び出すことができるのはなぜですか?

ポインターだけでなく値に対して sync.WaitGroup メソッドを呼び出すことができるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-16 07:44:09532ブラウズ

Why Can I Call sync.WaitGroup Methods on Values, Not Just Pointers?

なぜ 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 の仕様では、変数がアドレス指定可能で、そのメソッド セットにメソッドが含まれている場合、そのメソッドをメソッド上で直接呼び出すと規定されています。変数は、その変数へのポインターで呼び出すための短縮形です。

関連質問

このトピックの詳細については、関連する質問を参照してください。

    [オブジェクトへのポインターではなく、オブジェクトによるポインター レシーバーを使用してメソッドを呼び出しますか? ](https://stackoverflow.com/questions/4239271)

以上がポインターだけでなく値に対して sync.WaitGroup メソッドを呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。