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 dansos.Stdout(Print,Println,Printf).Fprint*→ écrit dans n'importe quelio.Writer(Fprintln(os.Stderr, ...),Fprintf(file, ...)).Sprint*→ renvoie une chaîne sans impression (Sprintf,Sprintln).Errorf→ construit unerrorformaté.
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 wrappatoLa 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
| Verbe | Ce qu'il fait |
|---|---|
%v | Valeur par défaut (appelle String() si implémenté). |
%+v | Structez avec des noms de champs. |
%#v | Syntaxe Go (utile pour le débogage et les instantanés). |
%T | Type dynamique de la valeur. |
%d | Entier en base 10. |
%b %o %x %X | Binaire, octal, hexadécimal (minuscules/majuscules). |
%f %e %g | Virgule flottante : fixe, exponentielle, compacte. |
%s | Chaîne (ou error/Stringer). |
%q | cité Chaîne de style Go (échappements inclus). |
%c | Caractère Unicode (rune). |
%p | Pointeur en hexadécimal. |
%w | Erreur de renvoi (uniquement à l'intérieur de Errorf). |
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.PointLargeur, 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 avec0(drapeau0).%.2f→ précision 2 décimales.%8.2f→ largeur 8, précision 2.
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.
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
Utilisez fmt.Sprintf pour formater la chaîne '[42]' à partir de l'entier 42, puis imprimez-la.
Solution disponible après 3 tentatives
Imprimez la structure p avec le verbe %+v (doit inclure les noms de champs).
Solution disponible après 3 tentatives
Quel verbe, utilisé dans fmt.Errorf, préserve la chaîne d'erreurs pour erreurs.Is/As ?
err := fmt.Errorf("read %q: ???", path, base)