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
Patricia Arquetteoriginal
2024-12-15 10:13:10926parcourir

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

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!

Déclaration:
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