Passer au contenu principal
eLearner.app
Module 8 · Leçon 1 sur 536/50 dans le cours~10 min
Leçons du module (1/5)

fmt avancé

Le package fmt est la passerelle vers toutes les E/S de texte dans Go. Bien le connaître signifie rédiger des journaux lisibles, des erreurs informatives et formater les valeurs de manière idiomatique sans recourir à des bibliothèques externes.

Les quatre familles

fmt expose les fonctions en quatre familles, distinguées par le préfixe :

  • Print* → écrit dans os.Stdout (Print, Println, Printf).
  • Fprint* → écrit dans n'importe quel io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)).
  • Sprint* → renvoie une chaîne sans impression (Sprintf, Sprintln).
  • Errorf → construit un error formaté.
Go
fmt.Println("hello")                       // stdout
fmt.Fprintln(os.Stderr, "boom")            // stderr
s := fmt.Sprintf("[%d]", 42)               // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // error wrappato

La différence entre Print et Println est uniquement l'espace entre les arguments et la nouvelle ligne de fin : Println ajoute toujours \n, Print ne le fait pas, Printf suit le format.

Verbes principaux

VerbeCe qu'il fait
%vValeur par défaut (appelle String() si implémenté).
%+vStructez avec des noms de champs.
%#vSyntaxe Go (utile pour le débogage et les instantanés).
%TType dynamique de la valeur.
%dEntier en base 10.
%b %o %x %XBinaire, octal, hexadécimal (minuscules/majuscules).
%f %e %gVirgule flottante : fixe, exponentielle, compacte.
%sChaîne (ou error/Stringer).
%qcité Chaîne de style Go (échappements inclus).
%cCaractère Unicode (rune).
%pPointeur en hexadécimal.
%wErreur de renvoi (uniquement à l'intérieur de Errorf).
Go
type Point struct{ X, Y int }
p := Point{1, 2}
fmt.Printf("%v\n", p)   // {1 2}
fmt.Printf("%+v\n", p)  // {X:1 Y:2}
fmt.Printf("%#v\n", p)  // main.Point{X:1, Y:2}
fmt.Printf("%T\n", p)   // main.Point

Largeur, précision, drapeaux

Les verbes numériques et de chaîne acceptent largeur et précision :

  • %6d → largeur minimale 6, remplissage des espaces à gauche.
  • %-6d → largeur 6, remplissage à droite (drapeau -).
  • %06d → largeur 6, remplissage avec 0 (drapeau 0).
  • %.2f → précision 2 décimales.
  • %8.2f → largeur 8, précision 2.
Go
fmt.Printf("|%6d|\n", 42)    // |    42|
fmt.Printf("|%-6d|\n", 42)   // |42    |
fmt.Printf("|%06d|\n", 42)   // |000042|
fmt.Printf("|%8.2f|\n", 3.14)// |    3.14|

Pour les tableaux alignés, la largeur fixe + %-...s pour les colonnes de texte est le modèle le plus simple avant de passer à text/tabwriter.

%w et enroulement des erreurs

%w est spécial : il fonctionne uniquement à l'intérieur de fmt.Errorf et conserve l'erreur d'origine dans la chaîne, afin que errors.Is et errors.As puissent la remonter.

Go
if _, err := os.Open(path); err != nil {
    return fmt.Errorf("read config %q: %w", path, err)
}

Utiliser %v au lieu de %w imprime le message d'erreur mais rompt la chaîne : pas de déballage, pas de errors.Is. Règle : Si vous souhaitez que l'appelant puisse distinguer le type ou l'identité de l'erreur, utilisez %w (un seul pour Errorf).

Exercices

Exercice#go.m8.l1.e1
Tentatives : 0Chargement…

Utilisez fmt.Sprintf pour formater la chaîne '[42]' à partir de l'entier 42, puis imprimez-la.

Chargement de l'éditeur…

Solution disponible après 3 tentatives

Exercice#go.m8.l1.e2
Tentatives : 0Chargement…

Imprimez la structure p avec le verbe %+v (doit inclure les noms de champs).

Chargement de l'éditeur…

Solution disponible après 3 tentatives

Quiz#go.m8.l1.e3
Prêt

Quel verbe, utilisé dans fmt.Errorf, préserve la chaîne d'erreurs pour erreurs.Is/As ?

Go
err := fmt.Errorf("read %q: ???", path, base)
Options de réponse