Einführung
Im Vergleich zu Verzweigungs- und Schleifenanweisungen ist die goto-Anweisung flexibler. Sie ermöglicht uns, bedingungslose Sprünge innerhalb derselben Funktion auszuführen. Obwohl die übermäßige Verwendung von goto die Lesbarkeit des Codes verringern kann, liegt ihr Hauptvorteil in ihrer Flexibilität. Bei angemessener Verwendung verbessert sie nicht nur die Effizienz des Programms, sondern macht den Code in bestimmten Szenarien auch kompakter und eleganter.
In diesem Lab werden Sie die Grundlagen der Verwendung der goto-Anweisung in Go kennenlernen, sowie ihre Anwendung in verschiedenen Szenarien, wie z. B. das Ersetzen von break-Anweisungen, das Implementieren von Schleifen und das Verlassen von geschachtelten Schleifen.
Wissenspunkte:
- Syntax und Verwendung von
goto - Praktische Anwendungen von
gotoin Go-Programmen
Grundlegendes zur Syntax von goto
Die Syntax von goto lautet wie folgt:
// Syntax 1: Vorwärts springen
goto label
...
label: code block
// Syntax 2: Rückwärts springen
label: code block
goto label
In Go bietet goto Flexibilität, da es sowohl vorwärts als auch rückwärts im Code springen kann. Das Label ist im Wesentlichen ein Marker, der angibt, wohin die Programmsteuerung springen soll. Labels sind case-sensitive (groß- und kleinschreibungsabhängig), und es wird empfohlen, Großbuchstaben für Labels zu verwenden, um die Lesbarkeit zu verbessern.
Hinweis: Sowohl die Deklaration als auch die Verwendung von Labels müssen innerhalb derselben Funktion erfolgen.
Beispiel: Ein einfaches goto-Programm
Lassen Sie uns ein einfaches Programm untersuchen, das die Verwendung von goto demonstriert. In diesem Beispiel überspringt das Programm bestimmte Zeilen und springt direkt zum Label:
- Erstellen Sie eine neue Go-Datei mit dem Namen
goto.go, indem Sie die folgenden Befehle ausführen:
cd ~/project
touch goto.go
- Öffnen Sie die Datei und schreiben Sie den folgenden Code:
package main
import "fmt"
func main() {
fmt.Println(1) // Gibt die Zahl 1 aus
goto NEXT // Springt zum Label "NEXT"
fmt.Println(2) // Diese Zeile wird übersprungen
NEXT:
fmt.Println(3) // Gibt die Zahl 3 aus
}
- Das Programm beginnt mit der Ausgabe der Zahl
1. - Anschließend trifft es auf die Anweisung
goto NEXT, was einen sofortigen Sprung zum LabelNEXTbewirkt. - Infolgedessen wird die Zeile
fmt.Println(2)übersprungen, und das Programm setzt die Ausführung ab dem LabelNEXTfort und gibt die Zahl3aus.
- Führen Sie das Programm aus:
go run goto.go
- Beobachten Sie die Ausgabe:
1
3
Dieses einfache Beispiel zeigt, wie goto auf einfache Weise zur Steuerung des Programmflusses verwendet werden kann.
Ersetzen von break durch goto
In bestimmten Situationen kann goto als Ersatz für die break-Anweisung in Schleifen verwendet werden, was die Flexibilität beim Verlassen von Schleifen basierend auf bestimmten Bedingungen bietet.
Beispiel: Verwendung von goto zum Verlassen einer Schleife
- Erstellen Sie eine neue Go-Datei mit dem Namen
break_with_goto.go:
cd ~/project
touch break_with_goto.go
- Schreiben Sie den folgenden Code in die Datei:
package main
import "fmt"
func main() {
for i := 0; ; i++ { // Eine Endlosschleife
if i == 10 { // Bedingung zum Verlassen der Schleife
goto END // Sprung zum Label "END"
}
fmt.Print(i) // Ausgabe des aktuellen Werts von i
}
END:
fmt.Println("END") // Ausgabe von "END" nach Verlassen der Schleife
}
- Das Programm startet eine Endlosschleife mit
for i := 0; ; i++. - Innerhalb der Schleife wird überprüft, ob
igleich10ist. Wenn dies der Fall ist, springt es zum LabelENDund verlässt somit die Schleife. - Vor dem Sprung werden die Werte von
ivon0bis9ausgegeben. - Nach dem Verlassen der Schleife gibt das Programm
ENDaus.
- Führen Sie das Programm aus:
go run break_with_goto.go
- Beobachten Sie die Ausgabe:
0123456789END
Dieses Beispiel zeigt, wie goto eine break-Anweisung in einer Schleife ersetzen kann und eine alternative Möglichkeit zum Beenden von Schleifen bietet.
Implementieren einer for-Schleife mit goto
goto kann auch verwendet werden, um eine Schleife manuell zu implementieren. Obwohl Go native for-Schleifen bietet, zeigt diese Übung, wie goto Schleifenverhalten nachahmen kann.
Beispiel: Eine for-Schleife mit goto
- Erstellen Sie eine neue Datei mit dem Namen
for_loop_with_goto.go:
cd ~/project
touch for_loop_with_goto.go
- Schreiben Sie den folgenden Code:
package main
import "fmt"
func main() {
var i = 0 // Initialisiere eine Variable i
BEGIN:
fmt.Printf("%d ", i) // Gib den aktuellen Wert von i aus
if i == 9 { // Prüfe, ob i den Wert 9 erreicht hat
goto END // Verlasse die Schleife, wenn dies der Fall ist
}
i++ // Inkrementiere i
goto BEGIN // Springe zurück zum Label "BEGIN"
END:
}
- Das Programm initialisiert
iauf0und startet die Schleife mit dem LabelBEGIN. - Es gibt den Wert von
iaus und prüft, ob er9erreicht hat. - Wenn nicht, inkrementiert es
iund springt zurück zum LabelBEGIN, wodurch der Vorgang wiederholt wird. - Sobald
igleich9ist, springt das Programm zum LabelEND, wodurch die Schleife beendet wird.
- Führen Sie das Programm aus:
go run for_loop_with_goto.go
- Beobachten Sie die Ausgabe:
0 1 2 3 4 5 6 7 8 9
Dieses Beispiel zeigt, wie goto Schleifenkonstrukte nachahmen kann.
Verlassen geschachtelter Schleifen mit goto
Das Verlassen von geschachtelten Schleifen kann mit break umständlich sein, da dies in der Regel zusätzliche Logik und Variablen erfordert. goto vereinfacht diesen Prozess, indem es direkte Sprünge aus mehreren Schleifen ermöglicht.
Beispiel: Verwendung von goto zum Verlassen von geschachtelten Schleifen
- Erstellen Sie eine neue Datei mit dem Namen
nested_loop_with_goto.go:
cd ~/project
touch nested_loop_with_goto.go
- Schreiben Sie den folgenden Code:
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ { // Äußere Schleife
for j := 0; j < 5; j++ { // Innere Schleife
if j == 3 { // Verlassen-Bedingung
goto END // Sprung zum Label "END"
}
fmt.Println(i, j) // Ausgabe der aktuellen Werte von i und j
}
}
END:
}
- Das Programm beginnt mit einer geschachtelten Schleife: einer äußeren Schleife für
iund einer inneren Schleife fürj. - Innerhalb der inneren Schleife wird überprüft, ob
jgleich3ist. Wenn dies der Fall ist, springt das Programm zum LabelENDund verlässt beide Schleifen. - Infolgedessen gibt das Programm die Paare
(i, j)nur bisjgleich2aus.
- Führen Sie das Programm aus:
go run nested_loop_with_goto.go
- Beobachten Sie die Ausgabe:
0 0
0 1
0 2
Dieser Ansatz ist viel sauberer als die Verwendung mehrerer break-Anweisungen oder Flags, insbesondere in tief geschachtelten Schleifen.
Wenn wir die break-Anweisung verwenden, um dieses Programm zu implementieren, sieht es wie folgt aus:
package main
import "fmt"
func main() {
// Prüfvariable
var check = false
// Erste Schleife
for i := 0; i < 5; i++ {
// Zweite Schleife
for j := 0; j < 5; j++ {
if j == 3 {
// Verlassen der zweiten Schleife
check = true
break
}
fmt.Println(i, j)
}
// Bestimmung, ob die erste Schleife verlassen werden soll
if check == true {
break
}
}
}
Zusammenfassung
In diesem Lab haben wir die goto-Anweisung in Go und ihre verschiedenen Anwendungen untersucht. Hier ist, was wir gelernt haben:
- Die
goto-Anweisung ermöglicht bedingungslose Sprünge zu angegebenen Labels innerhalb derselben Funktion. - Sie kann verwendet werden, um
break-Anweisungen zu ersetzen, Schleifen zu implementieren und geschachtelte Schleifen effizienter zu verlassen. - Obwohl
gotoFlexibilität und Kürze bietet, sollte es sparsam eingesetzt werden, um die Lesbarkeit des Codes nicht zu beeinträchtigen.
Indem Sie goto effektiv verstehen und nutzen, können Sie bestimmte Steuerfluss-Szenarien in Ihren Programmen vereinfachen. Streben Sie jedoch immer nach Klarheit und Wartbarkeit in Ihrem Code!



