Heim  >  Artikel  >  Backend-Entwicklung  >  Wie stellt Golang fest, dass der Kanal geschlossen wurde?

Wie stellt Golang fest, dass der Kanal geschlossen wurde?

尚
Original
2019-12-31 09:45:452963Durchsuche

Wie stellt Golang fest, dass der Kanal geschlossen wurde?

Der Kanal ähnelt in gewisser Weise einer Pipeline. Er spielt eine Rolle bei der Goroutine-Synchronisierung und -Kommunikation. Er ist auch der Schlüssel zum CSP-Modell.

Die meisten Typen in Golang sind Werttypen (nur Slice/Channel/Map sind Referenztypen). Wenn der Lese-/Schreibtyp ein Kanal vom Werttyp ist und die Elementgröße relativ groß ist, sollten Zeiger verwendet werden Vermeiden Sie stattdessen häufigen Speicherkopieraufwand.

Golangs Methode zur Bestimmung, ob ein Kanal geschlossen wurde:

Bestimmen Sie beim Lesen eines Kanals, ob er geschlossen wurde

_,ok := <- jobs

Wenn der Kanal zu diesem Zeitpunkt geschlossen ist, ist der ok-Wert falsch

Stellen Sie beim Schreiben in den Kanal fest, ob er geschlossen wurde

1 := <- Jobs

Wenn der Kanal zu diesem Zeitpunkt geschlossen ist, ist der ok-Wert falsch. Wenn der Kanal nicht geschlossen ist, wird ein Job verpasst

2 Methode

zum Erstellen eines weiteren Kanals mit dem Namen „Timeout“. Wenn eine Zeitüberschreitung auftritt, senden Sie „true“ an diesen Kanal, senden Sie Daten an den Kanal der Jobs im Produzenten. Verwenden Sie „select“, um die Zeitüberschreitung zu überwachen. Wenn eine Zeitüberschreitung auftritt, schließen Sie die Kanal der Jobs.

go func() {
 time.Sleep(time.Second * 3)
 timeout <- true
 }()
go func() {
 for i := 0; ; i++ {
 select {
     case <-timeout:
         close(jobs)
         return
 
     default:
         jobs <- i
         fmt.Println("produce:", i)
         }
     }
 }()

Für mehr Golang-Wissen beachten Sie bitte die SpalteGolang-Tutorial.

Das obige ist der detaillierte Inhalt vonWie stellt Golang fest, dass der Kanal geschlossen wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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