Heim > Backend-Entwicklung > Golang > Warum kann ich weiterhin Werte von einem Closed-Go-Kanal empfangen?

Warum kann ich weiterhin Werte von einem Closed-Go-Kanal empfangen?

DDD
Freigeben: 2024-12-09 17:42:12
Original
434 Leute haben es durchsucht

Why Can I Still Receive Values from a Closed Go Channel?

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)
    }
}
Nach dem Login kopieren

Ausgabe:

0
1
2
3
4
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage