Heim > Artikel > Backend-Entwicklung > Warum führt die Verwendung einer Kopie von Sync.WaitGroup in einer externen Funktion dazu, dass die Ausgabe in einer Goroutine fehlt?
Im bereitgestellten Code soll die primäre Goroutine Zahlen von 1 bis 11 unter Verwendung eines Kanals und eines drucken Wartegruppe. Gelegentlich wird jedoch Nummer 11 übersprungen, was zu einer unvollständigen Ausgabe führt.
Das Problem entsteht durch die falsche Zuordnung von sync.WaitGroup zur externen Funktion Print. Durch die Übergabe einer Kopie von WaitGroup an die Funktion kann sie den erforderlichen Done()-Aufruf nicht für die ursprüngliche Wartegruppe ausführen, auf die die Haupt-Goroutine wartet.
Beste Lösung:
Die empfohlene Lösung besteht darin, den Code wie folgt zu ändern:
<code class="go">func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
In diesem Fix erhält die Print-Funktion einen Zeiger auf die Wartegruppe und stellt so sicher, dass ihre Done()-Methode innerhalb der aufgerufen wird Funktion, wodurch die Haupt-Goroutine korrekt ausgeführt werden kann.
Alternative Lösung:
Alternativ kann man die Notwendigkeit von WaitGroup innerhalb der Print-Funktion eliminieren, indem man den Kanal direkt schließt nach dem Senden aller Nummern:
<code class="go">func Print(ch <-chan int) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } }</code>
In diesem Fall muss die Haupt-Goroutine stattdessen auf die Schließung des Kanals warten:
<code class="go">wg.Wait() close(ch)</code>
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung einer Kopie von Sync.WaitGroup in einer externen Funktion dazu, dass die Ausgabe in einer Goroutine fehlt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!