Comment lire depuis l'entrée standard en Go : du débutant au pro
\n\nVous êtes-vous déjà demandé comment faire « écouter » votre programme Go par l'utilisateur ? Comment écrire un utilitaire qui accepte des commandes depuis la console, ou un outil CLI interactif ? Si oui, vous êtes au bon endroit. Aujourd'hui, nous allons détailler la lecture depuis l'entrée standard (stdin) en Go — aussi en profondeur que possible.
\n\nCe sujet est un véritable succès sur Stack Overflow. La question « How can I read from standard input in the console? » a rassemblé des milliers de vues. Et ce n'est pas pour rien : l'entrée standard est la base sans laquelle aucun projet sérieux en Go ne peut se passer. Nous adaptons cette question pour un public francophone et la transformons en un tutoriel complet.
\n\nDans cet article, vous apprendrez :
\n- \n
- Ce qu'est
os.Stdinet comment l'utiliser \n - Comment utiliser
bufio.Scannerpour une lecture ligne par ligne \n - Pourquoi
fmt.Scanest une arme à double tranchant \n - Comment lire des fichiers entiers depuis stdin \n
- Les secrets de la gestion des erreurs et des performances \n
C'est parti !
\n\nQu'est-ce que stdin et pourquoi en a-t-on besoin en Go ?
\n\nL'entrée standard (stdin) est un flux de données que votre programme reçoit depuis la console ou depuis un autre processus. En Go, elle est représentée par la variable os.Stdin de type *os.File. C'est la porte par laquelle les données entrent dans votre programme.
Pourquoi en a-t-on besoin ? Imaginez :
\n- \n
- Vous écrivez un utilitaire CLI qui traite la saisie utilisateur \n
- Vous créez un analyseur de logs qui lit les données via un pipe (
cat log.txt | monapp) \n - Vous devez implémenter une saisie interactive avec des invites \n
Go, en tant que langage de programmation système, offre des outils élégants pour travailler avec stdin. Examinons-les dans l'ordre.
\n\nMéthode 1 : bufio.Scanner — le roi de la lecture ligne par ligne
\n\nLa méthode la plus populaire et recommandée pour lire depuis stdin en Go est bufio.Scanner. Il est simple, efficace et résout 90 % des problèmes.
Voici à quoi ressemble un exemple classique :
\n\npackage main\n\nimport (\n "bufio"\n "fmt"\n "os"\n)\n\nfunc main() {\n scanner := bufio.NewScanner(os.Stdin)\n fmt.Println("Saisissez du texte (Ctrl+D pour terminer) :")\n \n for scanner.Scan() {\n line := scanner.Text()\n fmt.Println("Vous avez saisi :", line)\n }\n \n if err := scanner.Err(); err != nil {\n fmt.Fprintln(os.Stderr, "Erreur de lecture :", err)\n }\n}\n\nComment cela fonctionne-t-il ?
\n- \n
bufio.NewScanner(os.Stdin)— crée un scanner qui lit depuis l'entrée standard \n scanner.Scan()— renvoietruetant qu'il y a des données (par défaut jusqu'au caractère de nouvelle ligne) \n scanner.Text()— renvoie la ligne actuelle sans le caractère\\n\n - La boucle s'arrête à
EOF(Ctrl+D sous Linux/Mac, Ctrl+Z sous Windows) \n
Ce code est la base de toute saisie console Go. Il fonctionne parfaitement avec les pipes et la saisie interactive.
\n\nPersonnalisation du Scanner
\n\nPar défaut, Scanner divise la saisie par lignes. Mais vous pouvez modifier cela :
// Lecture par mots\nscanner.Split(bufio.ScanWords)\n\n// Lecture par octets\nscanner.Split(bufio.ScanBytes)\n\n// Lecture par caractères (runes)\nscanner.Split(bufio.ScanRunes)\n\nVous pouvez également définir votre propre séparateur — par exemple pour du CSV ou des délimiteurs personnalisés. Mais cela fera l'objet d'un article séparé.
\n\nMéthode 2 : fmt.Scan — rapide et sale
\n\nSi vous avez besoin de saisir une seule valeur — un nombre, une chaîne ou plusieurs variables — fmt.Scan vient à la rescousse. C'est comme scanf en C, mais en