Verwendung der goto-Anweisung

GolangGolangBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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 goto in Go-Programmen
Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Anfänger mit einer Abschlussquote von 100% ist. Es hat eine positive Bewertungsrate von 100% von den Lernenden erhalten.

Das Verständnis der 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:

  1. Erstellen Sie eine neue Go-Datei mit dem Namen goto.go, indem Sie die folgenden Befehle ausführen:
cd ~/project
touch goto.go
  1. Ö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 Label NEXT bewirkt.
  • Infolgedessen wird die Zeile fmt.Println(2) übersprungen, und das Programm setzt die Ausführung ab dem Label NEXT fort und gibt die Zahl 3 aus.
  1. Führen Sie das Programm aus:
go run goto.go
  1. 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

  1. Erstellen Sie eine neue Go-Datei mit dem Namen break_with_goto.go:
cd ~/project
touch break_with_goto.go
  1. 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 i gleich 10 ist. Wenn dies der Fall ist, springt es zum Label END und verlässt somit die Schleife.
  • Vor dem Sprung werden die Werte von i von 0 bis 9 ausgegeben.
  • Nach dem Verlassen der Schleife gibt das Programm END aus.
  1. Führen Sie das Programm aus:
go run break_with_goto.go
  1. 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.

Implementierung 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

  1. Erstellen Sie eine neue Datei mit dem Namen for_loop_with_goto.go:
cd ~/project
touch for_loop_with_goto.go
  1. 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 i auf 0 und startet die Schleife mit dem Label BEGIN.
  • Es gibt den Wert von i aus und prüft, ob er 9 erreicht hat.
  • Wenn nicht, inkrementiert es i und springt zurück zum Label BEGIN, wodurch der Vorgang wiederholt wird.
  • Sobald i gleich 9 ist, springt das Programm zum Label END, wodurch die Schleife beendet wird.
  1. Führen Sie das Programm aus:
go run for_loop_with_goto.go
  1. Beobachten Sie die Ausgabe:
0 1 2 3 4 5 6 7 8 9

Dieses Beispiel zeigt, wie goto Schleifenkonstrukte nachahmen kann.

Verlassen von geschachtelten 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

  1. Erstellen Sie eine neue Datei mit dem Namen nested_loop_with_goto.go:
cd ~/project
touch nested_loop_with_goto.go
  1. 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 i und einer inneren Schleife für j.
  • Innerhalb der inneren Schleife wird überprüft, ob j gleich 3 ist. Wenn dies der Fall ist, springt das Programm zum Label END und verlässt beide Schleifen.
  • Infolgedessen gibt das Programm die Paare (i, j) nur bis j gleich 2 aus.
  1. Führen Sie das Programm aus:
go run nested_loop_with_goto.go
  1. 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 goto Flexibilitä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!