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