Heim >Backend-Entwicklung >Golang >Warum werden die Add-, Done- und Wait-Funktionen von WaitGroup mithilfe eines Zeigers aufgerufen, selbst wenn sie als Variable deklariert sind?

Warum werden die Add-, Done- und Wait-Funktionen von WaitGroup mithilfe eines Zeigers aufgerufen, selbst wenn sie als Variable deklariert sind?

DDD
DDDOriginal
2024-11-26 04:13:18379Durchsuche

Why are WaitGroup's Add, Done, and Wait functions called using a pointer even when declared as a variable?

Zeiger oder Variable in der WaitGroups-Referenz

Im Synchronisierungspaket werden die Funktionen „Add“, „Done“ und „Wait“ für WaitGroups alle von a aufgerufen Zeiger auf eine WaitGroup. Der folgende Code scheint dieser Konvention jedoch zu widersprechen:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {

    defer wg.Done()

    fmt.Printf("Worker %d starting\n", id)

    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {

    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    wg.Wait()
}

Während in diesem Code „Done“ mithilfe einer Zeigervariablen aufgerufen wird, werden „Add“ und „Wait“ mithilfe einer Variablen (kein Zeiger) aufgerufen.

Erklärung:

Trotz der Variablendeklaration var wg sync.WaitGroup sind die Befehle „Hinzufügen“, „Fertig“ und „Warten“ nicht zulässig Auf Funktionen wird über ihren Zeigerempfänger (*WaitGroup) zugegriffen. Der Wert von wg wird vom Go-Compiler implizit in einen Zeiger konvertiert. Dies ist notwendig, da die Methoden als Zeigerempfänger definiert sind, wie in den Funktionsdeklarationen zu sehen ist:

Add -------> func (wg *WaitGroup) Add(delta int)
Done ------> func (wg *WaitGroup) Done()
Wait ------> func (wg *WaitGroup) Wait()

Bei der Übergabe eines Nicht-Zeigerwerts an eine Zeigerempfängermethode übernimmt der Compiler automatisch deren Adresse (den Zeiger). zum Wert). Obwohl wg als Variable deklariert ist, werden daher alle drei Funktionen immer noch über einen Zeiger auf wg aufgerufen.

Der Hauptgrund für die Verwendung von Zeigerempfängern besteht darin, unnötiges Kopieren von Daten zu vermeiden. Durch die Übergabe eines Zeigers kann die Funktion die zugrunde liegende WaitGroup direkt ändern, anstatt eine Kopie davon zu erstellen. Dies verbessert die Leistung, insbesondere bei häufig geänderten WaitGroups.

Im bereitgestellten Code ist es wichtig, die Adresse von wg an den Worker zu übergeben, denn wenn sie als Wert (ohne das &) übergeben wurde, ist die Done-Funktion in Jeder Worker würde auf einen anderen Zeiger als „Add“ und „Wait“ in der Hauptfunktion verweisen. Dies würde zu Fehlverhalten führen.

Das obige ist der detaillierte Inhalt vonWarum werden die Add-, Done- und Wait-Funktionen von WaitGroup mithilfe eines Zeigers aufgerufen, selbst wenn sie als Variable deklariert sind?. 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