Maison > développement back-end > Golang > Une clause If est-elle nécessaire pour sortir de la boucle d'entrée de bufio.Scanner ?

Une clause If est-elle nécessaire pour sortir de la boucle d'entrée de bufio.Scanner ?

Barbara Streisand
Libérer: 2024-11-08 07:51:02
original
866 Les gens l'ont consulté

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

Supprimer input.Scan() sans clause If

Le traitement des entrées est crucial pour interagir avec les utilisateurs dans les programmes Go. Le package bufio.Scanner fournit un moyen pratique de lire les entrées de la console. Cependant, la fonction de division par défaut de Scanner, ScanLines, peut se comporter différemment que prévu, laissant certains se demander si une clause if est nécessaire pour sortir de la boucle d'entrée.

L'extrait de code fourni démontre une approche courante pour sortir de la boucle d'entrée. de la boucle d'entrée à l'aide d'une clause if :

input := bufio.NewScanner(os.Stdin)
for input.Scan() {
    if input.Text() == "end" { break }
    fmt.Println(input.Text())
}
Copier après la connexion

Cependant, la documentation indique que ScanLines renverra false lorsqu'il atteindra la fin de l'entrée ou rencontrera une erreur. Le passage suivant de la documentation suggère qu'une clause if peut ne pas être requise :

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.
Copier après la connexion

En y regardant de plus près, il devient évident que cette hypothèse est incorrecte. ScanLines est en fait la fonction de division par défaut prédéfinie des fonctions analysées. La documentation indique explicitement que ScanLines renvoie chaque ligne de texte, débarrassée de tout marqueur de fin de ligne. Cela signifie qu'il renverra des lignes vides et que la dernière ligne d'entrée non vide sera renvoyée même si elle n'a pas de nouvelle ligne.

En tant que telle, une ligne vide ne signale pas la fin du flux d'entrée, et il devient essentiel d’utiliser une clause if ou une méthode alternative pour gérer les scénarios de sortie anticipée. L'extrait suivant démontre une approche alternative :

input := bufio.NewScanner(os.Stdin)
for {
    if !input.Scan() {
        break
    }
    if input.Text() == "end" { break }
    fmt.Println(input.Text())
}
Copier après la connexion

En conclusion, bien que ScanLines renvoie false lorsqu'il atteint la fin de l'entrée, l'absence de marqueur de fin de ligne dans la dernière ligne et le le retour de lignes vides oblige à utiliser une clause if ou une approche alternative pour sortir gracieusement de la boucle d'entrée.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal