Maison >développement back-end >Golang >Pourquoi ma fonction Go `reader.ReadString` ne traite-t-elle pas correctement les entrées de l'utilisateur ?

Pourquoi ma fonction Go `reader.ReadString` ne traite-t-elle pas correctement les entrées de l'utilisateur ?

DDD
DDDoriginal
2024-12-14 03:21:10670parcourir

Why is my Go `reader.ReadString` function not correctly processing user input?

Dépannage de "reader.ReadString" dans Go

Dans Go, bufio.Reader fournit la méthode ReadString pour lire une ligne d'entrée à partir d'un flux, s’arrêtant à un caractère délimiteur spécifié. Cependant, lors de l'utilisation de cette méthode pour récupérer les entrées de l'utilisateur, on peut parfois observer que la première occurrence du délimiteur n'est pas supprimée de la chaîne renvoyée.

Considérez le code suivant :

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
    }
}

Lorsque ce programme s'exécute, il invite l'utilisateur à saisir son nom, mais même si l'utilisateur saisit « Alice » ou « Bob », le programme affiche de manière incorrecte « Vous n'êtes pas autorisé ici ! Obtenez OUT !!".

Le problème réside dans le fait que la méthode ReadString lit la ligne d'entrée jusqu'à ce que le délimiteur spécifié soit rencontré. Cependant, dans son comportement par défaut, il ne supprime pas le délimiteur de la chaîne renvoyée. Cela signifie que lorsque l'utilisateur entre "Alice", la valeur du texte sera en réalité "Alicen", ce qui ne correspond à aucun des noms de la fonction aliceOrBob.

Pour résoudre ce problème, on peut soit utiliser des chaînes .TrimSpace pour supprimer le caractère de nouvelle ligne du texte avant de le vérifier dans la fonction aliceOrBob :

import (
    ....
    "strings"
    ....
)

...
if aliceOrBob(strings.TrimSpace(text)) {
...

Alternativement, on peut utiliser la méthode ReadLine au lieu de ReadString pour lire une ligne d’entrée depuis os.Stdin. ReadLine renvoie une tranche d'octets représentant la ligne, sans le caractère de nouvelle ligne. Cependant, comme aliceOrBob attend une chaîne, il faudra convertir la tranche d'octets en chaîne à l'aide de la fonction string :

...
text, _, _ := reader.ReadLine()
if aliceOrBob(string(text)) {
...

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn