Maison > développement back-end > Golang > le corps du texte

Dois-je utiliser des pointeurs ou des variables avec les fonctions Ajouter, Terminer et Attendre de Go ?

Barbara Streisand
Libérer: 2024-11-22 07:35:16
original
810 Les gens l'ont consulté

Should I Use Pointers or Variables with Go's WaitGroup's Add, Done, and Wait Functions?

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal