Lecții din modul (1/5)
`fmt` avansat
Pachetul fmt este poarta de acces către toate I/O textuale din Go. A cunoaște bine înseamnă a scrie jurnalele care pot fi citite, erorile informative și formatarea valorilor idiomatic, fără a recurge la biblioteci externe.
Cele patru familii
fmt expune funcții în patru familii, distinse prin prefix:
Print*→ scrie înos.Stdout(Print,Println,Printf).Fprint*→ scrie în oriceio.Writer(Fprintln(os.Stderr, ...),Fprintf(file, ...)).Sprint*→ returnează un șir fără tipărire (Sprintf,Sprintln).Errorf→ creează un formaterror.
fmt.Println("hello") // stdout
fmt.Fprintln(os.Stderr, "boom") // stderr
s := fmt.Sprintf("[%d]", 42) // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // wrapped errorDiferența dintre Print și Println este doar spațiul dintre argumente și linia nouă de la urmă: Println adaugă întotdeauna \n, __PROTECTED_INLINE_20, nu, Printf urmează formatul.
Verbe principale
| Verb | Ce face |
|---|---|
%v | Valoare implicită (apelează String() dacă este implementată). |
%+v | Structurați cu nume de câmpuri. |
%#v | Sintaxa Go (utilă pentru depanare și instantanee). |
%T | Tipul dinamic al valorii. |
%d | Număr întreg în baza 10. |
%b %o %x %X | Binar, octal, hexazecimal (minuscule/majuscule). |
%f %e %g | Virgulă flotantă: fixă, exponențială, compactă. |
%s | Șir (sau error/Stringer). |
%q | Șir cotat în stil Go (escape incluse). |
%c | Caracter Unicode (rune). |
%p | Indicatorul în hexazecimal. |
%w | Eroare wrap (numai în interiorul 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.PointLățime, precizie, steaguri
Verbele numerice și șir acceptă lățime și precizie:
%6d→ lățime minimă 6, umplutură stângă cu spații.%-6d→ lățime 6, umplutură dreapta (steagul-).%06d→ lățime 6, umplutură cu0(steagul0).%.2f→ precizie 2 cifre zecimale.%8.2f→ latime 8, precizie 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|Pentru tabelele aliniate, lățimea fixă + %-...s pentru coloanele de text este cel mai simplu model înainte de a trece la text/tabwriter.
%w și împachetare eroare
%w este special: funcționează doar în interiorul fmt.Errorf și păstrează eroarea inițială din lanț, astfel încât errors.Is și errors.As să o poată parcurge.
if _, err := os.Open(path); err != nil {
return fmt.Errorf("read config %q: %w", path, err)
}Folosind %v în loc de %w tipărește mesajul de eroare, dar rupe lanțul: fără despachetare, fără errors.Is. Regulă: dacă doriți ca apelantul să poată distinge tipul sau identitatea erorii, utilizați %w (doar unul pe Errorf).
Exerciții
Folosiți fmt.Sprintf pentru a formata șirul „[42]” din întregul 42, apoi tipăriți-l.
Soluție disponibilă după 3 încercări
Tipăriți structura p cu verbul %+v (trebuie să includă numele câmpurilor).
Soluție disponibilă după 3 încercări
Care verb, folosit în fmt.Errorf, păstrează lanțul de erori pentru erori.Is/As?
err := fmt.Errorf("read %q: ???", path, base)