Maison > Article > développement back-end > Pourquoi l'utilisation de « sync.WaitGroup » avec des fonctions externes entraîne-t-elle une impasse ?
Bonne pratique pour utiliser sync.WaitGroup avec des fonctions externes
Dans l'extrait de code fourni, vous rencontrez un blocage lorsque vous tentez d'utiliser une synchronisation .WaitGroup avec une fonction externe. L'erreur provient du passage incorrect d'une copie du WaitGroup à la fonction externe, ce qui entraîne que la méthode Done() n'est pas invoquée sur le WaitGroup prévu.
Pour résoudre ce problème, assurez-vous de transmettre un pointeur vers le WaitGroup prévu. WaitGroup à la place. Ce faisant, la fonction externe peut accéder au WaitGroup correct et appeler Done() de manière appropriée. Voici le code corrigé :
<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) // Pass a pointer to the WaitGroup go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() // Wait for both goroutines to finish } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
Alternativement, vous pouvez modifier la signature de la fonction Print pour supprimer le paramètre WaitGroup, comme indiqué ci-dessous :
<code class="go">func Print(ch <-chan int) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } }</code>
Dans ce cas, le Print La fonction est chargée de fermer le WaitGroup une fois l'opération terminée. Cette approche est préférable dans les scénarios où la fonction externe ne nécessite pas d'accès direct au WaitGroup.
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!