Heim >Backend-Entwicklung >Golang >Warum verarbeitet meine Go-Funktion „reader.ReadString' Benutzereingaben nicht korrekt?
Fehlerbehebung für „reader.ReadString“ in Go
In Go stellt bufio.Reader die ReadString-Methode zum Lesen einer Eingabezeile aus einem bereit Stream, der bei einem angegebenen Trennzeichen stoppt. Bei Verwendung dieser Methode zum Abrufen von Benutzereingaben kann jedoch manchmal beobachtet werden, dass das erste Vorkommen des Trennzeichens nicht aus der zurückgegebenen Zeichenfolge entfernt wird.
Beachten Sie den folgenden Code:
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Who are you? \nEnter your name: ") text, _ := reader.ReadString('\n') if aliceOrBob(text) { fmt.Printf("Hello, ", text) } else { fmt.Printf("You're not allowed in here! Get OUT!!") } } func aliceOrBob(text string) bool { if text == "Alice" { return true } else if text == "Bob" { return true } else { return false } }
Wenn dieses Programm ausgeführt wird, fordert es den Benutzer auf, seinen Namen einzugeben, aber selbst wenn der Benutzer „Alice“ oder „Bob“ eingibt, gibt das Programm fälschlicherweise „Sie dürfen hier nicht rein!“ aus OUT!!".
Das Problem liegt darin, dass die ReadString-Methode die Eingabezeile liest, bis das angegebene Trennzeichen erreicht wird. Im Standardverhalten wird das Trennzeichen jedoch nicht aus der zurückgegebenen Zeichenfolge entfernt. Das bedeutet, dass, wenn der Benutzer „Alice“ eingibt, der Textwert tatsächlich „Alicen“ lautet, was mit keinem der Namen in der aliceOrBob-Funktion übereinstimmt.
Um dies zu beheben, kann man entweder Zeichenfolgen verwenden .TrimSpace, um das Zeilenumbruchzeichen aus dem Text zu entfernen, bevor es in der aliceOrBob-Funktion überprüft wird:
import ( .... "strings" .... ) ... if aliceOrBob(strings.TrimSpace(text)) { ...
Alternativ kann man stattdessen die ReadLine-Methode verwenden von ReadString, um eine Eingabezeile aus os.Stdin zu lesen. ReadLine gibt einen Byte-Slice zurück, der die Zeile darstellt, ohne das Zeilenumbruchzeichen. Da aliceOrBob jedoch einen String erwartet, muss man das Byte-Slice mit der String-Funktion in einen String umwandeln:
... text, _, _ := reader.ReadLine() if aliceOrBob(string(text)) { ...
Das obige ist der detaillierte Inhalt vonWarum verarbeitet meine Go-Funktion „reader.ReadString' Benutzereingaben nicht korrekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!