Salt la conținutul principal
Modulul 8 · Lecția 1 din 536/50 în curs~10 min
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 în os.Stdout (Print, Println, Printf).
  • Fprint* → scrie în orice io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)).
  • Sprint* → returnează un șir fără tipărire (Sprintf, Sprintln).
  • Errorf → creează un format error.
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) // wrapped error

Diferenț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

VerbCe face
%vValoare implicită (apelează String() dacă este implementată).
%+vStructurați cu nume de câmpuri.
%#vSintaxa Go (utilă pentru depanare și instantanee).
%TTipul dinamic al valorii.
%dNumăr întreg în baza 10.
%b %o %x %XBinar, octal, hexazecimal (minuscule/majuscule).
%f %e %gVirgulă flotantă: fixă, exponențială, compactă.
%sȘir (sau error/Stringer).
%qȘir cotat în stil Go (escape incluse).
%cCaracter Unicode (rune).
%pIndicatorul în hexazecimal.
%wEroare wrap (numai în interiorul 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

Lăț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ă cu 0 (steagul 0).
  • %.2f → precizie 2 cifre zecimale.
  • %8.2f → latime 8, precizie 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|

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.

Go
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

Exercițiu#go.m8.l1.e1
Încercări: 0Se încarcă…

Folosiți fmt.Sprintf pentru a formata șirul „[42]” din întregul 42, apoi tipăriți-l.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Exercițiu#go.m8.l1.e2
Încercări: 0Se încarcă…

Tipăriți structura p cu verbul %+v (trebuie să includă numele câmpurilor).

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Quiz#go.m8.l1.e3
Gata

Care verb, folosit în fmt.Errorf, păstrează lanțul de erori pentru erori.Is/As?

Go
err := fmt.Errorf("read %q: ???", path, base)
Opțiuni de răspuns