Warum der Empfang von Werten aus einem geschlossenen Kanal möglich ist
In Go stellen Kanäle einen Kommunikationsmechanismus zwischen Goroutinen bereit. Wenn ein Kanal geschlossen ist, bedeutet dies, dass keine Werte mehr gesendet werden. Dies bedeutet jedoch nicht, dass vorhandene Werte im Puffer des Kanals sofort verworfen werden.
Die Spezifikation besagt, dass nach dem Schließen eines Kanals alle zuvor gesendeten Werte noch empfangen werden können, bevor der Nullwert empfangen wird. Dies liegt daran, dass der Puffer des Kanals als Warteschlange fungiert und die vor dem Schließvorgang gesendeten Werte speichert.
So funktioniert es:
Bedenken Sie den folgenden Code:
package main import "fmt" import "sync" import "time" func main() { iCh := make(chan int, 99) var wg sync.WaitGroup go func() { for i := 0; i < 5; i++ { wg.Add(1) go func(i int) { defer wg.Done() iCh <- i }(i) } wg.Wait() close(iCh) }() time.Sleep(5 * time.Second) for i := range iCh { fmt.Printf("%v\n", i) } }
Ausgabe:
0 1 2 3 4
Auch wenn der Kanal nach 5 Sekunden geschlossen wird, empfängt die for-Schleife weiterhin die 5 Werte, die vor dem Schließvorgang gesendet wurden. Dies liegt daran, dass der Kanalpuffer diese Werte speichert, bis sie verbraucht werden.
Erst nach dem Empfang aller zuvor gesendeten Werte gibt die for-Schleife den Nullwert zurück, was anzeigt, dass der Kanal geschlossen ist.
Warum der „Time.Sleep“-Trick fehlschlägt:
Der „time.Sleep“-Trick verhindert nicht, dass die Goroutinen weiterhin Werte senden in den Kanal, bevor dieser geschlossen wird. Während die Goroutinen 5 Sekunden lang schlafen, könnten sie zusätzliche Werte senden, die noch gepuffert und von der for-Schleife empfangen würden.
Das obige ist der detaillierte Inhalt vonWarum kann ich weiterhin Werte von einem Closed-Go-Kanal empfangen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!