Maison >développement back-end >Golang >Pourquoi le passage d'une structure WaitGroup par valeur provoque-t-il un blocage dans la communication du canal Go ?
Interblocage dans la communication du canal Go en raison du passage de la structure par valeur
Dans votre code, vous avez rencontré une erreur de blocage dans votre canal goroutine communication. Cette erreur est due au fait que vous transmettez une structure WaitGroup par valeur à vos goroutines, ce qui crée une copie du WaitGroup au lieu de partager la référence d'origine.
Pourquoi le passage par valeur provoque un blocage
Les structures dans Go sont transmises par valeur, pas par référence. Lorsque vous transmettez une structure à une fonction, une copie est créée et transmise à la fonction. Cela signifie que toute modification apportée à la structure au sein de la fonction ne sera pas reflétée dans la structure d'origine en dehors de la fonction.
Dans votre cas, les goroutines essaient de signaler au WaitGroup lorsqu'ils terminent leurs tâches. Cependant, comme ils utilisent une copie du WaitGroup, leurs appels Done() n'affectent pas le WaitGroup d'origine. Par conséquent, l'appel Wait() dans la goroutine principale ne se termine jamais, ce qui entraîne un blocage.
Solution : passer par le pointeur
Pour résoudre ce problème, vous vous devez transmettre le WaitGroup à vos goroutines par pointeur. Cela garantit que les goroutines et la goroutine principale partagent la même référence au WaitGroup.
Exemple de travail :
Voici une version corrigée de votre code :
<code class="go">package main import ( "fmt" "sync" ) func push(c chan int, wg *sync.WaitGroup) { for i := 0; i < 5; i++ { c <- i } wg.Done() } func pull(c chan int, wg *sync.WaitGroup) { for i := 0; i < 5; i++ { result, ok := <-c fmt.Println(result, ok) } wg.Done() } func main() { var wg sync.WaitGroup wg.Add(2) c := make(chan int) go push(c, &wg) go pull(c, &wg) wg.Wait() }</code>
Maintenant, lorsque vous exécutez ce code, vous ne devriez plus rencontrer l'erreur de blocage. Les goroutines signaleront avec succès le WaitGroup et la goroutine principale pourra terminer son exécution.
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!