在之前的兩篇文章,我們學會了如何定義 struct
、用工廠函式創建實體,以及使用方法和指標接收器讓遙控車動起來。今天的這篇,我們要升級,教你更靈活地使用 struct
和方法,打造更智慧、更實用的遙控車!
之前的 Drive()
是改變車子狀態的「命令」型方法。但有的時候,我們希望方法告訴我們車子的狀態,比如「還有沒有電」、「跑了多久」等等。
範例:新增一個檢查電量是否足夠跑下一步的 CanDrive()
方法,會回傳 true
或 false
:
func (car *Car) CanDrive() bool {
return car.battery >= car.batteryDrain
}
使用時就可以這樣寫:
if myCar.CanDrive() {
myCar.Drive()
} else {
fmt.Println("電量不足,請充電!")
}
這樣不但程式看起來更乾淨,也讓邏輯更明確。
除了跑和檢查,我們可以再加一個充電 Recharge()
方法:
func (car *Car) Recharge() {
car.battery = 100
fmt.Println("電池已充滿!")
}
這樣一來,我們的 Car
不只會「跑」,還會「看電量」和「充電」,功能更全面:
myCar := NewCar(5, 2)
for i := 0; i < 10; i++ {
if myCar.CanDrive() {
myCar.Drive()
fmt.Println("跑了", myCar.distance, "米,剩餘電量", myCar.battery)
} else {
myCar.Recharge()
}
}
這邊做一個小實驗,讓同學們體會兩者差異:
func (car Car) ShowStatusValue() {
fmt.Printf("值接收器:電量 %d, 距離 %d\n", car.battery, car.distance)
}
func (car *Car) ShowStatusPointer() {
fmt.Printf("指標接收器:電量 %d, 距離 %d\n", car.battery, car.distance)
}
使用時呼叫:
myCar := NewCar(5, 2)
myCar.ShowStatusValue() // 傳值,顯示的是副本,資料不會被改
myCar.ShowStatusPointer() // 傳指標,顯示的是本體資料
這樣可以幫助理解:指標接收器可以修改物件狀態,值接收器不行。
請大家動手試試看這個挑戰:
struct
更像「有生命」的物件。祝大家玩得開心、學得有成,就靠這台跑得又快又聰明的遙控車了!