Maison > Article > développement back-end > Une clause If est-elle nécessaire pour sortir de la boucle d'entrée de bufio.Scanner ?
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()) }
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.
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()) }
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!