Maison > développement back-end > Golang > Pourquoi « fmt.Scanf » de Go n'attend-il pas toujours la saisie de l'utilisateur ?

Pourquoi « fmt.Scanf » de Go n'attend-il pas toujours la saisie de l'utilisateur ?

Patricia Arquette
Libérer: 2024-12-15 10:13:10
original
925 Les gens l'ont consulté

Why Doesn't Go's `fmt.Scanf` Always Wait for User Input?

Pourquoi Fmt.Scanf dans Go n'attend pas la saisie de l'utilisateur

Dans le livre de programmation Go de Caleb Doxsey, une question se pose concernant l'utilisation de fmt.Scanf. Le problème vient du fait que le programme ne s'arrête pas après le deuxième Scanf, en attendant l'entrée de l'utilisateur. De plus, la tâche de validation des entrées utilisateur, en particulier les entiers et les valeurs non vides, doit être abordée.

Pour comprendre ce comportement, nous devons approfondir le fonctionnement interne de fmt.Scanf. Dans les versions antérieures de Go, fmt.Scanf avait une limitation : il considérait un retour chariot (r) suivi d'une nouvelle ligne (n) comme un caractère de nouvelle ligne valide. Cependant, ce comportement était en contradiction avec la convention Windows consistant à utiliser uniquement r comme caractère de nouvelle ligne. En conséquence, fmt.Scanf passerait immédiatement au Scanf suivant sans attendre la saisie de l'utilisateur.

Pour résoudre ce problème et améliorer la gestion des saisies, considérez le code modifié suivant qui inclut des vérifications d'entrée valide :

import (
    "fmt"
)

func main() {
    var inputSquare float64
    n, err := fmt.Scanf("%f\n", &inputSquare)
    if err != nil || n != 1 {
        fmt.Println(n, err)
    }

    var inputGuess float64
    n, err = fmt.Scanf("%f\n", &inputGuess)
    if err != nil || n != 1 {
        fmt.Println(n, err)
    }
}
Copier après la connexion

L'inclusion de "n" dans la chaîne de format garantit que fmt.Scanf ne se poursuit qu'une fois que l'utilisateur a saisi une nouvelle ligne, éliminant ainsi le problème d'avancer sans attendre. saisir. De plus, nous disposons désormais d'une validation d'entrée utilisant les variables n et err renvoyées par Scanf. Si n n'est pas égal à 1, cela indique qu'il y a eu une erreur ou que l'utilisateur n'a saisi aucune entrée valide. err fournit un contexte supplémentaire sur l'erreur survenue.

En conclusion, fmt.Scanf s'est comporté de manière inattendue dans le passé en raison d'un problème de compatibilité sous Windows. Cependant, ce problème a depuis été résolu et l'utilisation d'une vérification de nouvelle ligne dans la chaîne de format garantit qu'elle attend désormais la saisie de l'utilisateur. De plus, l'inclusion de la validation des entrées nous permet de vérifier si l'utilisateur a saisi des valeurs valides, telles que des entiers ou des réponses non vides.

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