A metódus egy olyan függvény, amelynek van egy speciális receiver argumentuma.
A receiver a saját argumentumlistájában, a func kulcsszó és a metódus neve között jelenik meg.
func (receiver type) MethodName(parameters) (returnTypes) {
}
Csak olyan receiverrel definiálhatsz metódust, amelynek típusa ugyanabban a csomagban van definiálva, mint maga a metódus.
package person
type Person struct {
Name string
}
func (p Person) Greetings() string {
return fmt.Sprintf("Welcome %s!", p.Name)
}
A struktúrához tartozó metódust pontszintaxissal hívhatod meg.
p := Person{Name: "Bronson"}
fmt.Println(p.Greetings())
// Output: Welcome Bronson!
Figyeld meg, ahogy a Greetings() metódust meghívtuk a p nevű Person példányon.
Pontosan úgy, ahogy egy objektumorientált programozási nyelvben hívod meg a metódusokat.
Ne feledd: a metódus nem más, mint egy függvény receiver argumentummal. A metódusok segítenek elkerülni a névütközéseket: mivel egy metódus egy adott receiver típushoz kötődik, ugyanazt a metódusnevet használhatod különböző típusokon.
import "math"
type rect struct {
width, height int
}
func (r rect) area() int {
return r.width * r.height
}
type circle struct {
radius int
}
func (c circle) area() float64 {
return math.Pow(float64(c.radius), 2) * math.Pi
}
Kétféle receiver létezik: érték szerinti és mutató szerinti.
Az eddig látott metódusok mind érték szerinti receivert használnak, ami azt jelenti, hogy a metódusnak átadott érték egy másolatát kapják meg, így a metóduson belül a receiveren végzett módosítások nem láthatók a hívó számára.
Mutató szerinti receiverrel is deklarálhatsz metódusokat, hogy módosítani tudd azt az értéket, amelyre a receiver mutat.
Ezt úgy éred el, hogy a típusnév elé egy *-ot teszel.
Például a rect típusnál egy mutató szerinti receiver így nézne ki: *rect.
Az ilyen módosítások a metódus hívója számára is láthatók.
type rect struct {
width, height int
}
func (r *rect) squareIt() {
r.height = r.width
}
r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20
r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10
Megjegyzés: Ez a feladat a need-for-speed feladat folytatása.
Ebben a feladatban különféle távirányítós autók közötti versenyeket fogsz szervezni. Minden autónak saját sebesség- és akkumulátorfogyasztási jellemzői vannak.
Az autók teljesen feltöltött (100%-os) akkumulátorral indulnak. Valahányszor elvezeted az autót a távirányítóval, az megteszi az autó sebességének megfelelő távolságot méterben, és az akkumulátor töltöttségét az akkumulátorfogyasztás mértékével csökkenti.
Ha az autó akkumulátorának töltöttsége az akkumulátorfogyasztás százalékos értéke alá esik, nem tudod tovább vezetni az autót.
A távirányítós autón van egy mutatós LED-kijelző, amely két információt jelenít meg:
"Driven <METERS> meters"."Battery at <PERCENTAGE>%".Minden versenypályának saját hossza van. Az autókat úgy vizsgálják, hogy képesek-e befejezni a pályát anélkül, hogy kimerülne az akkumulátoruk.
Valósítsd meg a Car típus Drive metódusát, amely az autó sebessége alapján frissíti a megtett méterek számát, és az akkumulátorfogyasztásnak megfelelően csökkenti az akkumulátor töltöttségét:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car.Drive()
// car is now Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}
Megjegyzés: Ne próbáld vezetni az autót, ha ettől az akkumulátor töltöttsége 0 alá csökkenne.
Valósítsd meg a Car DisplayDistance metódusát, amely string-ként visszaadja a távolságot úgy, ahogy a LED-kijelzőn megjelenik:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
fmt.Println(car.DisplayDistance())
// Output: "Driven 0 meters"
Valósítsd meg a Car DisplayBattery metódusát, amely string-ként visszaadja az akkumulátor töltöttségét úgy, ahogy a LED-kijelzőn megjelenik:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
fmt.Println(car.DisplayBattery())
// Output: "Battery at 100%"
Ahhoz, hogy egy autó befejezzen egy versenyt, képesnek kell lennie megtenni a verseny távját.
Ez azt jelenti, hogy nem merülhet ki az akkumulátora, mielőtt átlépi a célvonalat.
Valósítsd meg a CanFinish metódust, amely egy trackDistance int paramétert vár, és true-t ad vissza, ha az autó be tudja fejezni a versenyt; egyébként false-t:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
trackDistance := 100
car.CanFinish(trackDistance)
// => true
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.