Bei der Arbeit mit Kanälen in Go ist es wichtig, den richtigen Zeitpunkt zum Schließen zu bestimmen. Dies stellt eine Herausforderung dar, wenn die Länge des Kanals unbekannt ist.
Stellen Sie sich das folgende Szenario vor:
package main import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { for i := 0; i < 100; i++ { ch <- i } close(ch) }() for v := range ch { fmt.Println(v) } }
In diesem Beispiel sendet eine Goroutine 100 Werte an den Kanal mit der Absicht, ihn zu schließen sobald alle Werte gesendet wurden. Dieser Ansatz gibt jedoch Anlass zur Sorge. Konkret:
Um diese Probleme zu beheben, kann eine sync.WaitGroup verwendet werden, um das Schließen des Kanals mit dem Abschluss der Sende-Goroutine zu synchronisieren.
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup ch := make(chan int) wg.Add(1) // Increment counter for sender goroutine go func() { defer wg.Done() // Decrement counter when goroutine completes for i := 0; i < 100; i++ { ch <- i } close(ch) }() go func() { wg.Wait() // Wait until the sender goroutine completes close(ch) // Close the channel after all values have been sent }() for v := range ch { fmt.Println(v) } }
Das obige ist der detaillierte Inhalt vonWie kann man einen Go-Kanal unbekannter Länge ordnungsgemäß schließen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!