Stringer est une interface qui permet de définir la représentation sous forme de chaîne de caractères des valeurs.
L'interface se compose d'une seule méthode String :
type Stringer interface {
String() string
}
Les types qui souhaitent implémenter cette interface doivent avoir une méthode String() qui renvoie une représentation du type sous forme de chaîne de caractères, lisible par un humain.
Le paquet fmt (et bien d'autres) utilise cette méthode pour mettre en forme et afficher les valeurs.
Imaginons 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 suit :
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 afficheront les valeurs Distance avec 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 l'affichage plus informatif, 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 pour mettre en forme les valeurs Distance :
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km
Ton équipe travaille sur une application de météorologie.
Elle a défini une API avec différents types et constantes représentant des données météorologiques, voir le fichier meteorology.go.
Ta tâche consiste à ajouter des méthodes String appropriées à tous les types afin qu'ils implémentent l'interface Stringer.
Stringer pour le type TemperatureUnit
Après quelques discussions, l'équipe a convenu que l'unité de température serait soit Celsius, soit Fahrenheit.
Les valeurs doivent être formatées comme dans les exemples ci-dessous.
Fais en sorte que le type TemperatureUnit implémente l'interface Stringer en lui ajoutant une méthode String.
Cette méthode doit renvoyer la string "°C" si l'unité de température est Celsius ou "°F" si l'unité de température est Fahrenheit.
celsiusUnit := Celsius
fahrenheitUnit := Fahrenheit
celsiusUnit.String()
// => °C
fahrenheitUnit.String()
// => °F
fmt.Sprint(celsiusUnit)
// Output: °C
Stringer pour le type Temperature
Les valeurs de température sont composées d'un entier et d'une unité de température. Elles doivent être formatées comme dans les exemples ci-dessous.
Pour cela, fais en sorte que le type Temperature implémente l'interface Stringer en lui ajoutant une méthode String.
Cette méthode doit renvoyer une string contenant la valeur numérique de la température et l'unité de température séparées par un espace : <temperature> <unit> :
celsiusTemp := Temperature{
degree: 21,
unit: Celsius,
}
celsiusTemp.String()
// => 21 °C
fmt.Sprint(celsiusTemp)
// Output: 21 °C
fahrenheitTemp := Temperature{
degree: 75,
unit: Fahrenheit,
}
fahrenheitTemp.String()
// => 75 °F
fmt.Sprint(fahrenheitTemp)
// Output: 75 °F
Stringer pour le type SpeedUnit
Après de longues discussions, l'équipe a convenu que l'unité de vitesse du vent serait soit KmPerHour, soit MilesPerHour.
Les valeurs doivent être formatées comme dans les exemples ci-dessous.
Pour cela, fais en sorte que le type SpeedUnit implémente l'interface Stringer en lui ajoutant une méthode String.
Cette méthode doit renvoyer la string "km/h" si l'unité de vitesse est exprimée en kilomètres par heure ou "mph" si l'unité de vitesse est exprimée en miles par heure :
mphUnit := MilesPerHour
mphUnit.String()
// => mph
fmt.Sprint(mphUnit)
// Output: mph
kmhUnit := KmPerHour
kmhUnit.String()
// => km/h
fmt.Sprint(kmhUnit)
// Output: km/h
Stringer pour Speed
Les valeurs de vitesse du vent sont composées d'un entier et d'une unité de vitesse. Elles doivent être formatées comme dans l'exemple ci-dessous.
Pour cela, fais en sorte que le type Speed implémente l'interface Stringer en lui ajoutant une méthode String.
Cette méthode doit renvoyer une string contenant la valeur numérique de la vitesse et l'unité de vitesse séparées par un espace : <speed> <unit> :
windSpeedNow := Speed{
magnitude: 18,
unit: KmPerHour,
}
windSpeedNow.String()
// => 18 km/h
fmt.Sprintf(windSpeedNow)
// Output: 18 km/h
windSpeedYesterday := Speed{
magnitude: 22,
unit: MilesPerHour,
}
windSpeedYesterday.String()
// => 22 mph
fmt.Sprint(windSpeedYesterday)
// Output: 22 mph
Stringer pour le type MeteorologyData
Les données météorologiques précisent l'emplacement, la température, la direction du vent, la vitesse du vent et l'humidité. Elles doivent être formatées comme dans l'exemple ci-dessous :
Pour cela, fais en sorte que le type MeteorologyData implémente l'interface Stringer en lui ajoutant une méthode String.
Cette méthode doit renvoyer les données météorologiques dans le format suivant :
<location>: <temperature>, Wind <wind_direction> at <wind_speed>, <humidity>% Humidity
sfData := MeteorologyData{
location: "San Francisco",
temperature: Temperature{
degree: 57,
unit: Fahrenheit
},
windDirection: "NW",
windSpeed: Speed{
magnitude: 19,
unit: MilesPerHour
},
humidity: 60
}
sfData.String()
// => San Francisco: 57 °F, Wind NW at 19 mph, 60% Humidity
fmt.Sprint(sfData)
// Output: San Francisco: 57 °F, Wind NW at 19 mph, 60% Humidity
Inscris-toi sur Exercism pour apprendre et maîtriser Go avec 34 concepts165 exercices, et un vrai mentorat humain, le tout gratuitement.