Stringer ist ein Interface zur Definition des String-Formats von Werten.
Das Interface besteht aus einer einzigen Methode String:
type Stringer interface {
String() string
}
Typen, die dieses Interface implementieren wollen, müssen eine String()-Methode haben, die eine für Menschen lesbare String-Darstellung des Typs zurückgibt.
Das Paket fmt (und viele andere) sucht nach dieser Methode, um Werte zu formatieren und auszugeben.
Angenommen, wir arbeiten an einer Anwendung, die mit geografischen Entfernungen in verschiedenen Einheiten umgeht.
Wir haben die Typen DistanceUnit und Distance wie folgt definiert:
type DistanceUnit int
const (
Kilometer DistanceUnit = 0
Mile DistanceUnit = 1
)
type Distance struct {
number float64
unit DistanceUnit
}
Im obigen Beispiel sind Kilometer und Mile Konstanten vom Typ DistanceUnit.
Diese Typen implementieren das Interface Stringer nicht, weil ihnen die Methode String fehlt.
Deshalb geben die fmt-Funktionen Distance-Werte im „Standardformat“ von Go aus:
mileUnit := Mile
fmt.Sprint(mileUnit)
// => 1
// The result is '1' because that is the underlying value of the 'Mile' constant (see constant declarations above)
dist := Distance{number: 790.7, unit: Kilometer}
fmt.Sprint(dist)
// => {790.7 0}
// not a very useful output!
Um die Ausgabe aussagekräftiger zu machen, implementieren wir das Interface Stringer für die Typen DistanceUnit und Distance, indem wir jedem Typ eine Methode String hinzufügen:
func (sc DistanceUnit) String() string {
units := []string{"km", "mi"}
return units[sc]
}
func (d Distance) String() string {
return fmt.Sprintf("%v %v", d.number, d.unit)
}
Die Funktionen des fmt-Pakets rufen diese Methoden auf, wenn sie Distance-Werte formatieren:
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km