Pointeur ou variable dans la référence des groupes d'attente
Le package de synchronisation fournit des fonctions telles que Ajouter, Terminer et Attendre pour gérer les groupes d'attente. Il est important de comprendre l'utilisation correcte des pointeurs et des variables lorsque vous travaillez avec ces fonctions.
Les fonctions Add et Wait sont appelées à l'aide d'un pointeur vers le groupe d'attente, comme indiqué dans leurs déclarations de fonction. Il s'agit d'un comportement attendu puisqu'ils modifient l'état interne du groupe d'attente.
Cependant, la fonction Done peut sembler être une exception dans l'exemple de code suivant :
var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait()
Dans ce code, le La fonction Done est appelée à l'aide d'une variable de pointeur (&wg). Cela pourrait prêter à confusion car cela diffère de l'utilisation de Add et Wait.
L'explication réside dans la façon dont les variables sont transmises aux fonctions dans Go. Lorsqu'une variable est passée en argument à une fonction, une copie de sa valeur est créée. Dans ce cas, si la fonction Done était appelée directement avec wg (sans le &), la fonction worker recevrait une copie du groupe d'attente. Toute modification apportée au sein de la fonction de travail n'affecterait pas l'instance de groupe d'attente d'origine dans la goroutine principale, ce qui entraînerait des problèmes de synchronisation.
Par conséquent, il est nécessaire de transmettre l'adresse du groupe d'attente (&wg) au Done. fonction afin que la fonction de travail ait un accès direct à l'instance de groupe d'attente d'origine et puisse modifier son état interne en conséquence.
Cela met également en évidence la différence entre les récepteurs de pointeur et de valeur dans Go. Les fonctions de récepteur peuvent être définies comme des récepteurs de pointeurs (*WaitGroup) ou des récepteurs de valeurs (WaitGroup). Les récepteurs pointeurs permettent à la fonction de modifier la valeur sous-jacente, tandis que les récepteurs de valeur créent une copie de la variable, permettant à la fonction d'opérer sur sa propre copie sans affecter l'original.
Dans ce cas particulier, il est nécessaire d'utiliser un récepteur de pointeur pour les trois fonctions (Ajouter, Terminé, Attendre) car elles doivent toutes modifier l'état interne du groupe d'attente. Bien que Terminé semble être une exception, il suit en fait le même principe consistant à fournir un accès direct à l'instance de groupe d'attente d'origine.
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!