Eine For-Schleifenausführung von außen unterbrechen: Eine Go-Programmierlösung
Beim Programmieren ist es oft notwendig, die Kontrolle über den Ausführungsfluss zu haben , insbesondere bei der Verwaltung von Schleifen. In Go kann es vorkommen, dass eine Endlosschleife von einer externen Quelle beendet werden muss. Dieser Artikel befasst sich mit diesem speziellen Szenario und bietet eine umfassende Lösung.
Problembeschreibung:
Stellen Sie sich eine Endlosschleife mit einer Bezeichnung vor, die gleichzeitig mit einer geplanten Funktion ausgeführt wird. Das Ziel besteht darin, die Schleife zu unterbrechen, wenn eine bestimmte Bedingung innerhalb der geplanten Funktion erfüllt ist. Nachfolgend finden Sie ein Beispiel für einen solchen Versuch, der aufgrund von Einschränkungen des Umfangs scheitert:
<code class="go">package main import ( "fmt" "sync" "time" ) func main() { count := 0 var wg sync.WaitGroup wg.Add(1) t := time.NewTicker(time.Second * 1) go func() { for { fmt.Println("I will print every second", count) count++ if count > 5 { break myLoop; // Issue due to scope error: 'myLoop' not visible wg.Done() } <-t.C } }() i := 1 myLoop: for { fmt.Println("iteration", i) i++ } wg.Wait() fmt.Println("I will execute at the end") }
Lösung:
Um diese gewünschte Funktionalität zu erreichen, verwenden wir einen Signalisierungskanal . Hier ist eine Schritt-für-Schritt-Anleitung:
1. Erstellen Sie einen Signalisierungskanal:
Wir erstellen einen Signalisierungskanal vom Typ chan struct{}. Dieser Kanal dient als Signal dafür, wann die Schleife enden soll.
<code class="go">quit := make(chan struct{})
2. Schließen Sie den Kanal zur Signalunterbrechung:
Wenn die Bedingung innerhalb der geplanten Funktion erfüllt ist, schließen wir den Signalkanal. Dies zeigt an, dass die for-Schleife unterbrochen werden sollte.
<code class="go">go func() { for { fmt.Println("I will print every second", count) count++ if count > 5 { close(quit) wg.Done() return } <-t.C } }()</code>
3. Überprüfen Sie, ob der Kanal geschlossen ist, um die Schleife zu unterbrechen:
In der for-Schleife lesen wir mithilfe einer Select-Anweisung aus dem Signalisierungskanal. Wenn der Kanal geschlossen ist (was eine Unterbrechung signalisiert), verzweigt die Ausführung zum case <-quit:-Block, wodurch die Schleife unterbrochen wird. Andernfalls führt der Standardfall die Iterationen wie gewohnt aus.
<code class="go">myLoop: for { select { case <-quit: break myLoop default: fmt.Println("iteration", i) i++ } }</code>
Diese Lösung ermöglicht es uns effektiv, die Ausführung einer Schleife von außerhalb ihres eigenen Bereichs zu steuern, sodass wir die Schleife bei Bedarf ohne Bedenken beenden können Umfangsbeschränkungen.
Das obige ist der detaillierte Inhalt vonWie kann ich von einer externen Funktion aus eine For-Schleife in Go verlassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!