Das Stringer-Interface
Die Darstellung von Typen anpassen
Das Stringer-Interface ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Standardmäßige Struct-Ausgabe
Standardmäßig zeigt die Ausgabe eines Structs mit %v seine unveränderten Felder. Das ist beim Debuggen in Ordnung, aber nicht immer gut lesbar.
package main
import "fmt"
type Color struct{ R, G, B int }
func main() {
c := Color{255, 0, 0}
fmt.Println(c)
}Das Stringer-Interface
Das Interface fmt.Stringer hat eine Methode:
String() string
Jeder Typ, der diese Methode definiert, bestimmt damit, wie er bei der Ausgabe erscheint.
package main
import "fmt"
type Greeting struct{ Name string }
func (g Greeting) String() string {
return "Hello, " + g.Name
}
func main() {
fmt.Println(Greeting{"Ada"})
}Automatisch verwendet
Wenn ein Typ über eine String()-Methode verfügt, rufen Println, Printf mit %v oder %s und verwandte Funktionen sie automatisch auf.
package main
import "fmt"
type Greeting struct{ Name string }
func (g Greeting) String() string {
return "Hi " + g.Name
}
func main() {
g := Greeting{"Bob"}
fmt.Printf("%s and %v\n", g, g)
}Formatierung innerhalb von String()
Bauen Sie das Ergebnis mit fmt.Sprintf auf, um eine übersichtliche, individuell angepasste Darstellung zu erzeugen.
package main
import "fmt"
type Color struct{ R, G, B int }
func (c Color) String() string {
return fmt.Sprintf("rgb(%d, %d, %d)", c.R, c.G, c.B)
}
func main() {
fmt.Println(Color{255, 128, 0})
}Stringer bei benannten Typen
Stringer ist nicht nur für Structs gedacht. Jeder benannte Typ, selbst einer auf Basis von int, kann Stringer implementieren. Das ist das klassische Muster für Enums.
package main
import "fmt"
type Day int
func (d Day) String() string {
names := []string{"Mon", "Tue", "Wed"}
return names[d]
}
func main() {
fmt.Println(Day(1))
}Enums mit lesbarer Ausgabe
Kombinieren Sie iota mit Stringer, damit Konstanten als lesbare Namen statt als Zahlen ausgegeben werden.
package main
import "fmt"
type State int
const (
Idle State = iota
Running
Done
)
func (s State) String() string {
return []string{"Idle", "Running", "Done"}[s]
}
func main() {
fmt.Println(Running)
}Value- oder Pointer-Receiver
Wenn String() einen Value-Receiver verwendet, werden sowohl Werte als auch Pointer ansprechend ausgegeben. Bei einem Pointer-Receiver wird die Methode nur für Pointer verwendet.
package main
import "fmt"
type Tag struct{ Name string }
func (t Tag) String() string { return "#" + t.Name }
func main() {
t := Tag{"go"}
fmt.Println(t)
fmt.Println(&t)
}Endlose Rekursion vermeiden
Rufen Sie innerhalb der eigenen String()-Methode niemals fmt.Sprintf("%v", t) für denselben Typ auf. Dadurch wird String() immer wieder aufgerufen. Formatieren Sie stattdessen die Felder direkt.
package main
import "fmt"
type Money struct{ Cents int }
func (m Money) String() string {
return fmt.Sprintf("$%.2f", float64(m.Cents)/100)
}
func main() {
fmt.Println(Money{1050})
}Stringer in Slices
Wenn Sie einen Slice mit Stringer-Werten ausgeben, wird jedes Element mit seiner String()-Methode formatiert.
package main
import "fmt"
type Tag struct{ Name string }
func (t Tag) String() string { return "#" + t.Name }
func main() {
tags := []Tag{{"go"}, {"web"}}
fmt.Println(tags)
}Als Interface verwenden
Sie können jeden Stringer in einer fmt.Stringer-Variablen speichern und String() über das Interface aufrufen.
package main
import "fmt"
type City struct{ Name string }
func (c City) String() string { return "City of " + c.Name }
func main() {
var s fmt.Stringer = City{"Oslo"}
fmt.Println(s.String())
}Warum das wichtig ist
Durch die Implementierung von Stringer erzeugen Ihre Typen überall dort eine übersichtliche Ausgabe, wo sie ausgegeben oder protokolliert werden – ohne zusätzlichen Formatierungscode an jeder Aufrufstelle.
package main
import "fmt"
type Temp float64
func (t Temp) String() string {
return fmt.Sprintf("%.1f°C", float64(t))
}
func main() {
fmt.Println(Temp(21.5))
}Schnelltest
Welche Methode muss ein Typ definieren, um fmt.Stringer zu erfüllen?
Rückblick: Das Stringer-Interface
Sie haben gelernt, die Ausgabe anzupassen:
- Implementieren Sie
String() string, umfmt.Stringerzu erfüllen. fmtruft die Methode für%vund%sautomatisch auf.- Das ist besonders für Enums geeignet; vermeiden Sie rekursives
%vfür denselben Typ.
package main
import "fmt"
type Level int
func (l Level) String() string {
return []string{"low", "mid", "high"}[l]
}
func main() {
fmt.Println(Level(2))
}Häufig gestellte Fragen
Ist die Lektion „Das Stringer-Interface“ kostenlos?
Ja — der vollständige Text von „Das Stringer-Interface“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Das Stringer-Interface“?
Die Darstellung von Typen anpassen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Das Stringer-Interface“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Printf-Formatverben
- Sprintf und Fprintf
- Das Stringer-Interface
- Eingaben scannen