Maison > développement back-end > Golang > fmt.Scanln Erreur de nouvelle ligne inattendue : quelle est la distinction entre fmt.Scan et fmt.Scanln ?

fmt.Scanln Erreur de nouvelle ligne inattendue : quelle est la distinction entre fmt.Scan et fmt.Scanln ?

Barbara Streisand
Libérer: 2024-10-23 21:27:02
original
570 Les gens l'ont consulté

fmt.Scanln Unexpected Newline Error: What's the Distinction Between fmt.Scan and fmt.Scanln?

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

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

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

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