Heim > Backend-Entwicklung > Golang > Können Werte von einem geschlossenen Go-Kanal abgerufen werden, nachdem alle gesendeten Werte gepuffert wurden?

Können Werte von einem geschlossenen Go-Kanal abgerufen werden, nachdem alle gesendeten Werte gepuffert wurden?

Patricia Arquette
Freigeben: 2024-12-07 00:13:10
Original
838 Leute haben es durchsucht

Can Values Be Retrieved from a Closed Go Channel After All Sent Values Have Been Buffered?

Wertabruf aus geschlossenen Kanälen

In Go signalisiert das Schließen eines Kanals das Fehlen zukünftiger Wertübertragungen. Überraschenderweise ist es möglich, Werte aus einem geschlossenen Kanal abzurufen, selbst nachdem in der Go-Spezifikation festgelegt ist, dass Empfangsvorgänge ohne Blockierung Nullwerte zurückgeben sollten.

Lassen Sie uns in den Beispielcode eintauchen, um dieses Verhalten zu verstehen:

package main

import (
    "fmt"
    "sync"
    "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)
        }
        // Close the channel once all values are sent
        wg.Wait()
        close(iCh)
    }()
    // Sleep for 5 seconds, allowing all goroutines to complete
    time.Sleep(5 * time.Second)
    print("the channel should be closed by now\n")
    for i := range iCh {
        fmt.Printf("%v\n", i)
    }
    print("done")
}
Nach dem Login kopieren

Obwohl der Kanal vor der Bereichsanweisung geschlossen wurde, können wir die Werte dennoch abrufen und drucken. Dies liegt daran, dass der Kanalpuffer ursprünglich 5 zuvor gesendete Werte enthielt.

Die Go-Spezifikation

Die Go-Programmiersprachenspezifikation besagt, dass nach dem Schließen eines Kanals Empfangsvorgänge zurückkehren sollten Nullwerte ohne Blockierung. Dies gilt jedoch erst nach Erhalt aller zuvor gesendeten Werte. In unserem Beispiel bleiben die 5 zuvor gesendeten Werte im Kanal gepuffert, sodass wir sie auch nach dem Schließen abrufen können.

Standardmäßig haben mit make erstellte Kanäle eine Kapazität von Null, was bedeutet, dass das Senden eines Werts blockiert wird bis es empfangen wird. In unserem Beispiel hat der Kanal eine Kapazität von 99, was das Senden von Werten ohne Blockierung ermöglicht.

Fazit

Während das Schließen eines Kanals die Abwesenheit signalisiert Bei zukünftigen Wertübertragungen wird der Kanalpuffer nicht sofort geleert. Zuvor gesendete Werte können über Empfangsoperationen weiterhin abgerufen werden, auch wenn der Kanal geschlossen ist. Dieses Verhalten zeigt, wie wichtig es ist, sicherzustellen, dass alle Werte empfangen werden, bevor man sich darauf verlässt, dass der Nullwert von Empfangsvorgängen zurückgegeben wird.

Das obige ist der detaillierte Inhalt vonKönnen Werte von einem geschlossenen Go-Kanal abgerufen werden, nachdem alle gesendeten Werte gepuffert wurden?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage