Heim >Backend-Entwicklung >Golang >Warum behält „bufio.Reader.ReadString' von Go führende Trennzeichen bei und wie kann ich dieses Problem vermeiden?

Warum behält „bufio.Reader.ReadString' von Go führende Trennzeichen bei und wie kann ich dieses Problem vermeiden?

Susan Sarandon
Susan SarandonOriginal
2024-12-18 05:10:11283Durchsuche

Why Does Go's `bufio.Reader.ReadString` Preserve Leading Delimiters, and How Can I Avoid This Issue?

Reader.ReadString behält möglicherweise führende Trennzeichen bei

In Go kann sich das Verhalten von bufio.Reader.ReadString beim Parsen von Eingaben unterscheiden. Stellen Sie sich das folgende Szenario vor:

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Who are you? Enter your name: ")
    text, _ := reader.ReadString('\n')
    if text == "Alice" || text == "Bob" {
        fmt.Printf("Hello, ", text)
    } else {
        fmt.Printf("You're not allowed in here!")
    }
}

Hier wird ReadString zum Lesen von Benutzereingaben verwendet und erwartet Namen, die mit einem Zeilenumbruchzeichen abgeschlossen sind. Wenn der eingegebene Name jedoch mit „Alice“ oder „Bob“ übereinstimmt, verweigert das Programm fälschlicherweise den Zugriff.

Ursache und Lösung

Dieses Problem tritt auf, weil ReadString führende Vorkommen beibehält des Trennzeichens (in diesem Fall 'n'). Wenn ein Name wie „Alice“ eingegeben wird, enthält die im Text gespeicherte Zeichenfolge sowohl „Alice“ als auch einen abschließenden Zeilenumbruch. Dieses zusätzliche Zeilenumbruchzeichen verhindert, dass der Zeichenfolgenvergleich mit dem erwarteten Wert übereinstimmt.

Um dieses Problem zu beheben, ziehen Sie die folgenden Ansätze in Betracht:

  1. Führende Leerzeichen abschneiden: Vorher Wenn Sie Text mit „Alice“ oder „Bob“ vergleichen, verwenden Sie strings.TrimSpace(text), um alle führenden Leerzeichen, einschließlich der neuen Zeile, zu entfernen Zeichen.
  2. Verwenden Sie stattdessen ReadLine: Alternativ wechseln Sie zu reader.ReadLine() anstelle von ReadString. Diese Funktion gibt die Eingabe ohne führende oder nachgestellte Trennzeichen zurück. Beachten Sie, dass reader.ReadLine() Bytes zurückgibt; Wandeln Sie es daher mit string(bytes) in einen String um.

Das obige ist der detaillierte Inhalt vonWarum behält „bufio.Reader.ReadString' von Go führende Trennzeichen bei und wie kann ich dieses Problem vermeiden?. 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