Stringer ist ein Interface, mit dem du das String-Format von Werten festlegen kannst.
Das Interface besteht aus einer einzigen Methode String:
type Stringer interface {
String() string
}
Typen, die dieses Interface implementieren wollen, brauchen eine Methode String(), die eine benutzerfreundliche String-Darstellung des Typs zurückgibt.
Das Paket fmt (und viele andere) sucht nach dieser Methode, um Werte zu formatieren und auszugeben.
Nehmen wir an, wir arbeiten an einer Anwendung, die geografische Entfernungen verarbeitet, die in verschiedenen Einheiten gemessen werden.
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 Funktionen von fmt 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 informativer 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 Pakets fmt 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
Dein Team arbeitet an einer Meteorologie-Anwendung.
Es hat eine API mit verschiedenen Typen und Konstanten definiert, die meteorologische Daten repräsentieren. Sieh dir die Datei meteorology.go an.
Deine Aufgabe ist es, allen Typen passende String-Methoden hinzuzufügen, damit sie das Interface Stringer implementieren.
Stringer für den Typ TemperatureUnit
Nach einiger Diskussion hat sich das Team darauf geeinigt, dass die Temperatureinheit entweder Celsius oder Fahrenheit sein wird.
Die Werte sollten wie in den folgenden Beispielen formatiert werden.
Lass den Typ TemperatureUnit das Interface Stringer implementieren, indem du ihm eine String-Methode hinzufügst.
Diese Methode muss den String "°C" zurückgeben, wenn die Temperatureinheit Celsius ist, oder "°F", wenn die Temperatureinheit Fahrenheit ist.
celsiusUnit := Celsius
fahrenheitUnit := Fahrenheit
celsiusUnit.String()
// => °C
fahrenheitUnit.String()
// => °F
fmt.Sprint(celsiusUnit)
// Output: °C
Stringer für den Typ Temperature
Temperaturwerte bestehen aus einer Ganzzahl und einer Temperatureinheit. Sie sollten wie in den folgenden Beispielen formatiert werden.
Damit das passiert, lass den Typ Temperature das Interface Stringer implementieren, indem du ihm eine String-Methode hinzufügst.
Diese Methode sollte einen String zurückgeben, der den numerischen Wert für die Temperatur und die Temperatureinheit enthält, getrennt durch ein Leerzeichen: <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 für den Typ SpeedUnit
Nach langen Diskussionen hat sich das Team darauf geeinigt, dass die Einheit der Windgeschwindigkeit entweder KmPerHour oder MilesPerHour sein wird.
Die Werte sollten wie in den Beispielen unten formatiert werden.
Damit das passiert, lass den Typ SpeedUnit das Interface Stringer implementieren, indem du ihm eine String-Methode hinzufügst.
Diese Methode muss den String "km/h" zurückgeben, wenn die Geschwindigkeitseinheit Kilometer pro Stunde ist, oder "mph", wenn die Geschwindigkeitseinheit Meilen pro Stunde ist:
mphUnit := MilesPerHour
mphUnit.String()
// => mph
fmt.Sprint(mphUnit)
// Output: mph
kmhUnit := KmPerHour
kmhUnit.String()
// => km/h
fmt.Sprint(kmhUnit)
// Output: km/h
Stringer für Speed
Werte für die Windgeschwindigkeit bestehen aus einer Ganzzahl und einer Geschwindigkeitseinheit. Sie sollten wie im folgenden Beispiel formatiert werden.
Damit das passiert, lass den Typ Speed das Interface Stringer implementieren, indem du ihm eine String-Methode hinzufügst.
Diese Methode sollte einen String zurückgeben, der den numerischen Wert für die Geschwindigkeit und die Geschwindigkeitseinheit enthält, getrennt durch ein Leerzeichen: <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 für den Typ MeteorologyData
Meteorologische Daten geben den Ort, die Temperatur, die Windrichtung, die Windgeschwindigkeit und die Luftfeuchtigkeit an. Sie sollten wie im folgenden Beispiel formatiert werden:
Damit das passiert, lass den Typ MeteorologyData das Interface Stringer implementieren, indem du ihm eine String-Methode hinzufügst.
Diese Methode sollte die meteorologischen Daten im folgenden Format zurückgeben:
<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
Melde dich bei Exercism an, um Go mit 34 Konzepte166 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.