Maison > développement back-end > Golang > Pourquoi les fonctions Add, Done et Wait de WaitGroup sont-elles appelées à l'aide d'un pointeur même lorsqu'elles sont déclarées en tant que variable ?

Pourquoi les fonctions Add, Done et Wait de WaitGroup sont-elles appelées à l'aide d'un pointeur même lorsqu'elles sont déclarées en tant que variable ?

DDD
Libérer: 2024-11-26 04:13:18
original
385 Les gens l'ont consulté

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

Pointeur ou variable dans la référence des WaitGroups

Dans le package de synchronisation, les fonctions Ajouter, Terminé et Attendre pour les WaitGroups sont toutes appelées par un pointeur vers un WaitGroup. Cependant, le code suivant semble contredire cette convention :

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()
}
Copier après la connexion

Dans ce code, alors que Done est appelé à l'aide d'une variable pointeur, Add et Wait sont appelés à l'aide d'une variable (pas d'un pointeur).

Explication :

Malgré la déclaration de variable var wg sync.WaitGroup, les champs Add, Done et Les fonctions d'attente sont accessibles via leur récepteur pointeur (*WaitGroup). La valeur de wg est implicitement convertie en pointeur par le compilateur Go. Ceci est nécessaire car les méthodes sont définies comme des récepteurs de pointeurs, comme le montrent les déclarations de fonction :

Add -------> func (wg *WaitGroup) Add(delta int)
Done ------> func (wg *WaitGroup) Done()
Wait ------> func (wg *WaitGroup) Wait()
Copier après la connexion

Lors du passage d'une valeur non-pointeur à une méthode récepteur de pointeur, le compilateur prend automatiquement son adresse (le pointeur à la valeur). Par conséquent, même si wg est déclaré comme variable, les trois fonctions sont toujours appelées sur un pointeur vers wg.

La principale raison d'utiliser des récepteurs de pointeurs est d'éviter la copie inutile des données. En passant un pointeur, la fonction peut modifier directement le WaitGroup sous-jacent, plutôt que d'en faire une copie. Cela améliore les performances, notamment pour les WaitGroups fréquemment modifiés.

Dans le code fourni, il est crucial de transmettre l'adresse de wg au travailleur car si elle a été passée en valeur (sans le &), la fonction Done dans chaque travailleur ferait référence à un pointeur différent de Add et Wait dans la fonction principale. Cela entraînerait un comportement incorrect.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal