Lire l'entrée standard en Go : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment lire depuis l'entrée standard en Go : du débutant au pro

\n\n

Vous ê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\n

Ce 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\n

Dans cet article, vous apprendrez :

\n
    \n
  • Ce qu'est os.Stdin et comment l'utiliser
  • \n
  • Comment utiliser bufio.Scanner pour une lecture ligne par ligne
  • \n
  • Pourquoi fmt.Scan est une arme à double tranchant
  • \n
  • Comment lire des fichiers entiers depuis stdin
  • \n
  • Les secrets de la gestion des erreurs et des performances
  • \n
\n\n

C'est parti !

\n\n

Qu'est-ce que stdin et pourquoi en a-t-on besoin en Go ?

\n\n

L'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.

\n\n

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

Méthode 1 : bufio.Scanner — le roi de la lecture ligne par ligne

\n\n

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

\n\n

Voici à quoi ressemble un exemple classique :

\n\n
package 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\n

Comment cela fonctionne-t-il ?

\n
    \n
  • bufio.NewScanner(os.Stdin) — crée un scanner qui lit depuis l'entrée standard
  • \n
  • scanner.Scan() — renvoie true tant 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
\n\n

Ce code est la base de toute saisie console Go. Il fonctionne parfaitement avec les pipes et la saisie interactive.

\n\n

Personnalisation du Scanner

\n\n

Par défaut, Scanner divise la saisie par lignes. Mais vous pouvez modifier cela :

\n\n
// 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\n

Vous 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\n

Méthode 2 : fmt.Scan — rapide et sale

\n\n

Si 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

Blogs

Book Recommendations