A Stringer egy interfész, amellyel meghatározhatod az értékek string formátumát.
Az interfész egyetlen String metódusból áll:
type Stringer interface {
String() string
}
Azoknak a típusoknak, amelyek meg akarják valósítani ezt az interfészt, rendelkezniük kell egy String() metódussal, amely a típus emberbarát string-reprezentációját adja vissza.
A fmt csomag (és még sok más is) ezt a metódust keresi, amikor értékeket formáz és ír ki.
Tegyük fel, hogy egy olyan alkalmazáson dolgozunk, amely különböző mértékegységekben mért földrajzi távolságokkal foglalkozik.
A DistanceUnit és a Distance típust a következőképpen definiáltuk:
type DistanceUnit int
const (
Kilometer DistanceUnit = 0
Mile DistanceUnit = 1
)
type Distance struct {
number float64
unit DistanceUnit
}
A fenti példában a Kilometer és a Mile a DistanceUnit típus konstansai.
Ezek a típusok nem valósítják meg a Stringer interfészt, mert hiányzik belőlük a String metódus.
Ezért a fmt függvényei a Go „alapértelmezett formátumával” írják ki a Distance értékeket:
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!
Hogy a kimenet több információt adjon, megvalósítjuk a Stringer interfészt a DistanceUnit és a Distance típuson úgy, hogy mindkét típushoz hozzáadunk egy String metódust:
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)
}
A fmt csomag függvényei ezeket a metódusokat hívják meg, amikor Distance értékeket formáznak:
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km