ホームページ >バックエンド開発 >Golang >Go の sync.WaitGroup がポインターなしで機能するのはなぜですか?

Go の sync.WaitGroup がポインターなしで機能するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 22:27:15790ブラウズ

Why Can Go's sync.WaitGroup Work Without a Pointer?

なぜ 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 サイトの他の関連記事を参照してください。

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