Comment gérer les entrées invalides dans fmt.Scanf de Go
Pour ceux qui rencontrent des problèmes avec des entrées invalides lors de l'utilisation de fmt.Scanf(), c'est essentiel pour comprendre pourquoi le programme entre dans une boucle infinie lorsqu'une chaîne est saisie au lieu d'un entier.
Dans Go, fmt.Scanf() analyse le flux d'entrée pour un spécificateur de format spécifique (par exemple, "%d " pour un entier décimal). Une entrée non valide, telle qu'une chaîne, provoque une erreur, mais l'entrée reste dans le tampon Stdin. Par conséquent, les appels ultérieurs à fmt.Scanf() continuent de traiter la même entrée invalide, ce qui entraîne une boucle infinie.
Solution utilisant fmt.Scanln
Une approche alternative consiste à utiliser fmt.Scanln(), qui se comporte différemment. Il lit et consomme toute la ligne d'entrée, y compris les caractères non valides. Cela peut être mis en œuvre comme suit :
<code class="go">fmt.Printf("Please enter an integer: ") // Read in an integer var i int _, err := fmt.Scanln(&i) if err != nil { fmt.Printf("Error: %s", err.Error()) // If int read fails, read as string and forget var discard string fmt.Scanln(&discard) return } fmt.Printf("Input contained %d", i)</code>
Options supplémentaires
Si fmt.Scanln() n'est pas optimal, d'autres options incluent :
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!