Heim >Backend-Entwicklung >Golang >Warum kann sync.WaitGroup von Go ohne einen Zeiger funktionieren?

Warum kann sync.WaitGroup von Go ohne einen Zeiger funktionieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-06 22:27:15792Durchsuche

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

Warum funktioniert sync.WaitGroup ohne Zeigerempfänger?

In Go wird der Typ sync.WaitGroup zum Synchronisieren von Goroutinen verwendet. Die Methoden von sync.WaitGroup, z. B. Add, Done und Wait, werden mit Zeigerempfängern definiert. Es ist jedoch üblich, sync.WaitGroup-Werte ohne einen Zeiger (*) zu deklarieren.

Bedenken Sie den folgenden Ausschnitt:

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()
}

In diesem Code deklarieren wir wg als sync.WaitGroup Wert ohne Zeiger (*). Dies ist möglich, weil Go die Verwendung von Zeigerempfängern für Nicht-Zeigerwerte zulässt.

Unter der Haube konvertiert Go einen Nicht-Zeigerwert (wie in wg.Add(1)) in einen Zeigerwert (wie &wg.Add(1)). Dadurch können die Methoden von sync.WaitGroup für Nicht-Zeigerwerte aufgerufen werden.

Reflexion zum Methodensatz von sync.WaitGroup

Der Methodensatz von sync. WaitGroup ist leer, da alle seine Methoden Zeigerempfänger haben. Dies wird durch den folgenden Reflexionscode bestätigt:

wg := sync.WaitGroup{}
fmt.Println(reflect.TypeOf(wg).NumMethod()) // Outputs 0

Das bedeutet, dass sync.WaitGroup keine Methoden hat, die direkt auf Nicht-Zeigerwerte aufgerufen werden können.

Fazit

In Go ist es üblich, sync.WaitGroup-Werte ohne einen Zeiger (*) zu deklarieren. Dies ist möglich, weil Go die Verwendung von Zeigerempfängern für Nicht-Zeigerwerte ermöglicht. Der Methodensatz von sync.WaitGroup ist leer, da alle seine Methoden Zeigerempfänger haben, die vom Compiler automatisch aus Nicht-Zeigerwerten konvertiert werden.

Das obige ist der detaillierte Inhalt vonWarum kann sync.WaitGroup von Go ohne einen Zeiger funktionieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn