Tracks
/
Go
Go
/
Übungen
/
Meteorologie
Meteorologie

Meteorologie

Lernübung

Einführung

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.

Beispiel: Entfernungen

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

Anleitung

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.

1. Implementiere das Interface 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

2. Implementiere das Interface 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

3. Implementiere das Interface 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

4. Implementiere das Interface 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

5. Implementiere das Interface 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
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Go Exercism

Bereit, mit Meteorologie zu starten?

Melde dich bei Exercism an, um Go mit 34 Konzepte166 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.