Erreur de nouvelle ligne inattendue fmt.Scanln : analyse de la gestion des entrées de Go
De nombreux développeurs Go rencontrent "l'erreur de nouvelle ligne attendue par fmt.Scanln" lorsque interagir avec les entrées de l'utilisateur. Pour comprendre cette erreur, il est crucial de se plonger dans le fonctionnement de fmt.Scan et fmt.Scanln.
fmt.Scan et Space-Separated Input
fmt.Scan lit l'espace- entrées séparées de l’entrée standard. Chaque argument fourni à fmt.Scan correspond à un seul mot ou valeur séparé par des espaces. La présence de nouvelles lignes est traitée comme des espaces, permettant des entrées multi-lignes. Ceci est illustré par le code suivant :
<code class="go">import "fmt" func main() { var i int _, err := fmt.Scan(&i) if err == nil { fmt.Println("read 1 integer: ", i) } }</code>
Fourni avec l'entrée "123", ce code lira et imprimera "lire 1 entier : 123".
fmt.Scanln et Newline-Delimited Input
En revanche, fmt.Scanln attend un caractère de nouvelle ligne comme délimiteur. Après avoir lu toutes les entrées jusqu'à la nouvelle ligne, l'analyse s'arrête. Ceci est clairement indiqué dans la documentation de Scanln :
"Scanln est similaire à Scan, mais arrête l'analyse à une nouvelle ligne et après l'élément final, il doit y avoir une nouvelle ligne ou EOF."
Ce comportement se manifeste dans le code suivant :
<code class="go">import "fmt" func main() { var s string _, err := fmt.Scanln(&s) if err == nil { fmt.Println("read 1 line: ", s) } }</code>
Avec la saisie "tout le monde aime la glace", ce code lira et imprimera "lire 1 ligne : tout le monde aime la glace". La présence de "tout le monde" et "aime" séparés par un espace n'interrompt pas l'analyse car fmt.Scanln n'est délimité que par la nouvelle ligne finale.
Comprendre l'erreur
Dans Dans l'exemple initial fourni, Scanln rencontre l'erreur « nouvelle ligne attendue » car la chaîne d'entrée « tout le monde aime la crème glacée » ne se termine pas par une nouvelle ligne. Pour résoudre ce problème, un caractère de nouvelle ligne doit être présent à la fin de l'entrée.
Méthodes alternatives de lecture des lignes
Si l'objectif est de lire une ligne d'entrée, en utilisant ReadString du package bufio.Reader est une alternative fiable à fmt.Scanln :
<code class="go">import ( "bufio" "os" ) func main() { reader := bufio.NewReader(os.Stdin) line, err := reader.ReadString('\n') if err == nil { fmt.Println("read 1 line: ", line) } }</code>
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!