Stringer è un'interfaccia per definire il formato stringa dei valori.
L'interfaccia consiste di un unico metodo String:
type Stringer interface {
String() string
}
I tipi che vogliono implementare questa interfaccia devono avere un metodo String() che restituisce una rappresentazione a stringa del tipo, adatta a un essere umano.
Il pacchetto fmt (e molti altri) cercherà questo metodo per formattare e stampare i valori.
Supponiamo di lavorare a un'applicazione che gestisce distanze geografiche misurate in unità diverse.
Abbiamo definito i tipi DistanceUnit e Distance come segue:
type DistanceUnit int
const (
Kilometer DistanceUnit = 0
Mile DistanceUnit = 1
)
type Distance struct {
number float64
unit DistanceUnit
}
Nell'esempio qui sopra, Kilometer e Mile sono costanti di tipo DistanceUnit.
Questi tipi non implementano l'interfaccia Stringer, perché manca il metodo String.
Di conseguenza le funzioni di fmt stamperanno i valori Distance usando il "formato predefinito" di Go:
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!
Per rendere l'output più informativo, implementiamo l'interfaccia Stringer per i tipi DistanceUnit e Distance aggiungendo a ciascun tipo un metodo String:
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)
}
Le funzioni del pacchetto fmt chiameranno questi metodi quando formattano i valori Distance:
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km