Heim >Backend-Entwicklung >Golang >Ist eine If-Klausel notwendig, um aus der Eingabeschleife von bufio.Scanner auszubrechen?

Ist eine If-Klausel notwendig, um aus der Eingabeschleife von bufio.Scanner auszubrechen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-08 07:51:02832Durchsuche

Is an If-Clause Necessary to Break Out of bufio.Scanner's Input Loop?

Ausbrechen aus input.Scan() ohne If-Klausel

Eingabeverarbeitung ist entscheidend für die Interaktion mit Benutzern in Go-Programmen. Das bufio.Scanner-Paket bietet eine bequeme Möglichkeit, Eingaben von der Konsole zu lesen. Die standardmäßige Teilungsfunktion des Scanners, ScanLines, verhält sich jedoch möglicherweise anders als erwartet, sodass sich einige fragen, ob eine if-Klausel erforderlich ist, um aus der Eingabeschleife auszubrechen.

Das bereitgestellte Codefragment zeigt einen gängigen Ansatz zum Ausbrechen der Eingabeschleife mithilfe einer if-Klausel:

input := bufio.NewScanner(os.Stdin)
for input.Scan() {
    if input.Text() == "end" { break }
    fmt.Println(input.Text())
}

In der Dokumentation heißt es jedoch, dass ScanLines „false“ zurückgibt, wenn das Ende der Eingabe oder der Begegnungen erreicht wird ein Fehler. Die folgende Passage aus der Dokumentation legt nahe, dass eine if-Klausel möglicherweise nicht erforderlich ist:

Scan advances the Scanner to the next token, which will then be available through the Bytes or Text method. It returns false when the scan stops, either by reaching the end of the input or an error. After Scan returns false, the Err method will return any error that occurred during scanning, except that if it was io.EOF, Err will return nil.

Bei näherer Betrachtung stellt sich heraus, dass diese Annahme falsch ist. ScanLines ist eigentlich standardmäßig die vordefinierte Standardaufteilungsfunktion gescannter Funktionen. In der Dokumentation heißt es ausdrücklich, dass ScanLines jede Textzeile ohne nachgestellte Zeilenendemarkierungen zurückgibt. Dies bedeutet, dass leere Zeilen zurückgegeben werden und die letzte nicht leere Eingabezeile auch dann zurückgegeben wird, wenn sie keine neue Zeile enthält.

Daher signalisiert eine leere Zeile nicht das Ende des Eingabestreams und Es ist von entscheidender Bedeutung, eine if-Klausel oder eine alternative Methode zu verwenden, um Szenarien mit vorzeitigem Ausstieg zu bewältigen. Das folgende Snippet zeigt einen alternativen Ansatz:

input := bufio.NewScanner(os.Stdin)
for {
    if !input.Scan() {
        break
    }
    if input.Text() == "end" { break }
    fmt.Println(input.Text())
}

Zusammenfassend lässt sich sagen, dass ScanLines zwar false zurückgibt, wenn es das Ende der Eingabe erreicht, aber das Fehlen einer Zeilenendemarkierung in der letzten Zeile und die Die Rückgabe leerer Zeilen macht die Verwendung einer if-Klausel oder eines alternativen Ansatzes erforderlich, um ordnungsgemäß aus der Eingabeschleife auszubrechen.

Das obige ist der detaillierte Inhalt vonIst eine If-Klausel notwendig, um aus der Eingabeschleife von bufio.Scanner auszubrechen?. 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