Kurzusok
/
Go
Go
/
Feladatok
/
Meteorológia
Meteorológia

Meteorológia

Tanulófeladat

Bevezetés

A Stringer egy interfész, amellyel meghatározhatod az értékek string formátumát.

Az interfész egyetlen metódusból áll, ez pedig a String:

type Stringer interface {
    String() string
}

Azoknak a típusoknak, amelyek meg akarják valósítani ezt az interfészt, rendelkezniük kell egy String() metódussal, amely a típus ember számára olvasható string reprezentációját adja vissza. A fmt csomag (és sok más is) ezt a metódust keresi, amikor értékeket formáz és ír ki.

Példa: távolságok

Tegyük fel, hogy egy olyan alkalmazáson dolgozunk, amely különböző mértékegységekben mért földrajzi távolságokkal foglalkozik. A DistanceUnit és a Distance típust a következőképpen definiáltuk:

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

A fenti példában a Kilometer és a Mile a DistanceUnit típusú konstansok.

Ezek a típusok nem valósítják meg a Stringer interfészt, mert hiányzik belőlük a String metódus. Ezért a fmt függvényei a Go „alapértelmezett formátumával” írják ki a Distance értékeket:

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!

Hogy a kimenet több információt hordozzon, megvalósítjuk a Stringer interfészt a DistanceUnit és a Distance típuson úgy, hogy mindegyikhez hozzáadunk egy String metódust:

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

A fmt csomag függvényei ezeket a metódusokat hívják meg, amikor Distance értékeket formáznak:

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

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

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km

Utasítások

A csapatod egy meteorológiai alkalmazáson dolgozik. Definiáltak egy API-t, amely különböző, meteorológiai adatokat reprezentáló típusokat és konstansokat tartalmaz; lásd a meteorology.go fájlt.

A feladatod, hogy minden típushoz adj hozzá megfelelő String metódusokat, hogy implementálják a Stringer interfészt.

1. Implementáld a Stringer interfészt a TemperatureUnit típushoz

Némi vita után a csapat abban állapodott meg, hogy a hőmérséklet mértékegysége Celsius vagy Fahrenheit lesz. Az értékeket az alábbi példák szerint kell formázni.

Ahhoz, hogy a TemperatureUnit típus implementálja a Stringer interfészt, adj hozzá egy String metódust. Ennek a metódusnak a "°C" stringgel kell visszatérnie, ha a hőmérséklet mértékegysége Celsius, illetve a "°F" stringgel, ha a hőmérséklet mértékegysége Fahrenheit.

celsiusUnit := Celsius
fahrenheitUnit := Fahrenheit

celsiusUnit.String()
// => °C
fahrenheitUnit.String()
// => °F
fmt.Sprint(celsiusUnit)
// Output: °C

2. Implementáld a Stringer interfészt a Temperature típushoz

A hőmérsékletértékek egy egész számból és egy hőmérséklet-mértékegységből állnak. Formázásuk az alábbi példák szerint történik.

Ehhez add hozzá a Temperature típushoz a String metódust, hogy implementálja a Stringer interfészt. Ennek a metódusnak egy stringet kell visszaadnia, amelyben a hőmérséklet számértéke és a hőmérséklet mértékegysége egy szóközzel elválasztva szerepel: <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. Implementáld a Stringer interfészt a SpeedUnit típushoz

Hosszas megbeszélések után a csapat abban állapodott meg, hogy a szélsebesség mértékegysége KmPerHour vagy MilesPerHour lesz. Az értékeket az alábbi példák szerint kell formázni.

Ehhez add hozzá a SpeedUnit típushoz a String metódust, hogy implementálja a Stringer interfészt. Ennek a metódusnak a "km/h" stringgel kell visszatérnie, ha a sebesség mértékegysége kilométer per óra, illetve a "mph" stringgel, ha a sebesség mértékegysége mérföld per óra:

mphUnit := MilesPerHour
mphUnit.String()
// => mph
fmt.Sprint(mphUnit)
// Output: mph

kmhUnit := KmPerHour
kmhUnit.String()
// => km/h
fmt.Sprint(kmhUnit)
// Output: km/h

4. Implementáld a Stringer interfészt a Speed-hez

A szélsebességértékek egy egész számból és egy sebességmértékegységből állnak. Formázásuk az alábbi példa szerint történik.

Ehhez add hozzá a Speed típushoz a String metódust, hogy implementálja a Stringer interfészt. Ennek a metódusnak egy stringet kell visszaadnia, amelyben a sebesség számértéke és a sebesség mértékegysége egy szóközzel elválasztva szerepel: <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. Implementáld a Stringer interfészt a MeteorologyData típushoz

A meteorológiai adatok megadják a helyszínt, a hőmérsékletet, a szélirányt, a szélsebességet és a páratartalmat. Formázásuk az alábbi példa szerint történik:

Ehhez add hozzá a MeteorologyData típushoz a String metódust, hogy implementálja a Stringer interfészt. Ennek a metódusnak a következő formátumban kell visszaadnia a meteorológiai adatokat:

<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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Go Exercism

Készen állsz elkezdeni a(z) Meteorológia feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Go nyelvet 34 fogalom166 feladat segítségével, valódi emberi mentorálással, mindez ingyen.