Direkt zum Hauptinhalt springen
eLearner.app
Modul 8 · Lektion 1 von 536/50 im Kurs~10 min
Lektionen des Moduls (1/5)

Fortgeschrittenes `fmt`

Das fmt-Paket ist das Gateway zu allen textuellen E/A in Go. Wenn Sie es gut kennen, müssen Sie lesbare Protokolle schreiben, Fehler melden und Werte idiomatisch formatieren, ohne auf externe Bibliotheken zurückgreifen zu müssen.

Die vier Familien

fmt stellt Funktionen in vier Familien bereit, die durch das Präfix unterschieden werden:

  • Print* → schreibt nach os.Stdout (Print, Println, Printf).
  • Fprint* → schreibt in einen beliebigen io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)).
  • Sprint* → gibt einen String ohne Ausdruck zurück (os.Stdout0, os.Stdout1).
  • os.Stdout2 → erstellt einen formatierten os.Stdout3.
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

Der Unterschied zwischen Print und Println besteht nur im Leerzeichen zwischen den Argumenten und dem abschließenden Zeilenumbruch: Println fügt immer hinzu, Print nicht, Printf folgt dem Format.

Hauptverben

VerbWas es tut
%vStandardwert (ruft String() auf, falls implementiert).
%+vStruktur mit Feldnamen.
%#vGo-Syntax (nützlich für Debugging und Snapshots).
%TDynamischer Typ des Werts.
%dGanzzahl zur Basis 10.
%b %o %x %XBinär, oktal, hexadezimal (Klein-/Großbuchstaben).
%f %e %gGleitkomma: fest, exponentiell, kompakt.
%sZeichenfolge (oder error/String()0).
String()1Anführungszeichen-String im Go-Stil (einschließlich Escapezeichen).
String()2Unicode-Zeichen (String()3).
String()4Zeiger im Hexadezimalformat.
String()5Fehlerumbruch (nur innerhalb von String()6).
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

Breite, Präzision, Flags

Numerische und String-Verben akzeptieren Breite und Genauigkeit:

  • %6d → Mindestbreite 6, links mit Leerzeichen auffüllen.
  • %-6d → Breite 6, rechter Abstand (Flag -).
  • %06d → Breite 6, Auffüllen mit 0 (Flag 0).
  • %.2f → Genauigkeit 2 Dezimalstellen.
  • %8.2f → Breite 8, Genauigkeit 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|

Bei ausgerichteten Tabellen ist feste Breite + %-...s für Textspalten das einfachste Muster vor dem Wechsel zu text/tabwriter.

%w und Fehlerumbruch

%w ist etwas Besonderes: Es funktioniert nur innerhalb von fmt.Errorf und behält den ursprünglichen Fehler in der Kette bei, sodass errors.Is und errors.As ihn durchlaufen können.

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

Die Verwendung von %v anstelle von %w gibt die Fehlermeldung aus, unterbricht jedoch die Kette: kein Entpacken, kein errors.Is. Regel: Wenn Sie möchten, dass der Anrufer die Art oder Identität des Fehlers erkennen kann, verwenden Sie %w (nur einen pro Errorf).

Übungen

Übung#go.m8.l1.e1
Versuche: 0Wird geladen…

Verwenden Sie fmt.Sprintf, um die Zeichenfolge „[42]“ aus der Ganzzahl 42 zu formatieren, und drucken Sie sie dann aus.

Editor wird geladen…

Lösung nach 3 Versuchen verfügbar

Übung#go.m8.l1.e2
Versuche: 0Wird geladen…

Geben Sie die Struktur p mit dem Verb %+v aus (sie muss die Feldnamen enthalten).

Editor wird geladen…

Lösung nach 3 Versuchen verfügbar

Quiz#go.m8.l1.e3
Bereit

Welches Verb, das in fmt.Errorf verwendet wird, bewahrt die Fehlerkette fürerrors.Is/As?

Go
err := fmt.Errorf("read %q: ???", path, base)
Antwortoptionen