Heim > Artikel > Backend-Entwicklung > Warum müssen wir in Go auf die Auswahl warten?
PHP-Editor Zimo eingeführt: In der Go-Sprache ist die Select-Anweisung eine sehr wichtige Kontrollflussanweisung. Sie wird verwendet, um den Betrieb mehrerer Kanäle gleichzeitig zu überwachen, um eine Parallelitätskontrolle zu erreichen. Warum müssen Sie auf die Auswahl warten? Dies liegt daran, dass wir bei der gleichzeitigen Programmierung normalerweise Daten oder Ereignisse von mehreren Kanälen gleichzeitig verarbeiten müssen und die Select-Anweisung uns dabei helfen kann, mehrere Kanäle zu überwachen. Sobald einer der Kanäle betriebsbereit ist, wird die entsprechende Operation ausgeführt. Dadurch wird Parallelität erreicht. Durch die Verwendung von select können wir Blockierungen effektiv vermeiden und die Reaktionsfähigkeit und Parallelität des Programms verbessern.
Ich habe gerade die Kontextaufhebung gelernt. Hier ist mein Code.
package main import ( "fmt" "context" ) func main() { ctx := context.Background() do(ctx) } func do(ctx context.Context) { ctx, ctxCancel := context.WithCancel(ctx) resultCh := make(chan string) go terminate(ctx, resultCh) resultCh <- "value1" resultCh <- "value2" fmt.Println("pre cancel") ctxCancel() fmt.Println("post cancel") } func terminate(ctx context.Context, ch <-chan string) { for { select { case <-ctx.Done(): fmt.Println("terminate") return case result := <-ch: fmt.Println(result) } } }
Warum passiert das? Welche Kenntnisse benötige ich?
Aber die tatsächlich erhaltene Ausgabe enthält keine „Beendigung“.
value1 value2 pre cancel terminate post cancel
Ich habe time.Sleep unter der Abbruchfunktion hinzugefügt. Dann entspricht die Ausgabe meinen Erwartungen.
ctxCancel() time.Sleep(100 * time.Millisecond) // add
So wie ich es verstehe, besteht die Kernidee hinter der Verwendung von „select“ darin, darauf zu warten, dass mindestens eine Bedingung „bereit“ ist. Ich habe unten ein Beispiel bereitgestellt, das hilfreich sein könnte. Hier wird „select“ verwendet, um auf den Empfang eines Werts vom Kanal ch oder auf das Eintreten einer Zeitüberschreitung von 1 Sekunde zu warten.
import ( "fmt" "time" ) func main() { ch := make(chan int) go func() { // Simulate some time-consuming operation time.Sleep(2 * time.Second) ch <- 42 }() select { case result := <-ch: fmt.Println("Received result:", result) case <-time.After(1 * time.Second): fmt.Println("Timeout reached") } }
Das obige ist der detaillierte Inhalt vonWarum müssen wir in Go auf die Auswahl warten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!