Parcours
/
Go
Go
/
Programme
/
Stringers
St

Stringers en Go

1 exercice

À propos de Stringers

Stringer est une interface qui permet de définir la représentation d'une valeur sous forme de string.

Cette interface se compose d'une seule méthode String :

type Stringer interface {
    String() string
}

Les types qui souhaitent implémenter cette interface doivent posséder une méthode String() qui renvoie une représentation du type sous forme de string, lisible par un humain. Le paquet fmt (et bien d'autres) recherche cette méthode pour mettre en forme et afficher les valeurs.

Exemple : les distances

Imaginons que l'on travaille sur une application qui gère des distances géographiques mesurées dans différentes unités. On a défini les types DistanceUnit et Distance comme ceci :

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

Dans l'exemple ci-dessus, Kilometer et Mile sont des constantes de type DistanceUnit.

Ces types n'implémentent pas l'interface Stringer, car il leur manque la méthode String. Par conséquent, les fonctions de fmt affichent les valeurs de Distance en utilisant le « format par défaut » de 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!

Pour rendre la sortie plus informative, on implémente l'interface Stringer pour les types DistanceUnit et Distance en ajoutant une méthode String à chacun d'eux :

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)
}

Les fonctions du paquet fmt appellent ces méthodes lorsqu'elles mettent en forme des valeurs de Distance :

kmUnit := Kilometer
kmUnit.String()
// => km

mileUnit := Mile
mileUnit.String()
// => mi

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Stringers