iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Modern Web

後端攻略筆記系列 第 12

Day 12 : Struct入門 3 - 遙控車 (方法回傳、多方法設計)

  • 分享至 

  • xImage
  •  

第三篇:Go Struct 進階實戰 — 方法回傳、多方法設計與實用挑戰

在之前的兩篇文章,我們學會了如何定義 struct、用工廠函式創建實體,以及使用方法和指標接收器讓遙控車動起來。今天的這篇,我們要升級,教你更靈活地使用 struct 和方法,打造更智慧、更實用的遙控車!


方法也能回傳結果,幫助我們做判斷

之前的 Drive() 是改變車子狀態的「命令」型方法。但有的時候,我們希望方法告訴我們車子的狀態,比如「還有沒有電」、「跑了多久」等等。

範例:新增一個檢查電量是否足夠跑下一步的 CanDrive() 方法,會回傳 truefalse

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

值接收器 vs 指標接收器(reciever),實戰比較

這邊做一個小實驗,讓同學們體會兩者差異:

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()  // 傳指標,顯示的是本體資料

這樣可以幫助理解:指標接收器可以修改物件狀態,值接收器不行


小挑戰:設計可充電的遙控車

請大家動手試試看這個挑戰:

  1. 做一個遙控車,具有驅動、檢查電量、充電三個方法。
  2. 當電量足夠時,可以跑,跑一次會扣電且累積距離。
  3. 電量不夠時,必須充電再跑。
  4. 在主程式中設計一個迴圈,模擬車子連續跑和充電的過程。

小結

  • 方法不只修改資料,也能回傳結果讓程式更乾淨。
  • 多個方法配合,能讓 struct 更像「有生命」的物件。
  • 實驗值接收器和指標接收器,幫助釐清它們的差別與適用情境。
  • 動手挑戰能鞏固所學,讓程式技能更有感!

祝大家玩得開心、學得有成,就靠這台跑得又快又聰明的遙控車了!


上一篇
Day 11 : Struct入門 2 - 讓你的遙控車動起來!Go 方法與指標的秘密
下一篇
Day 13 : Go Interface 入門 1 - 讓你的程式會變魔術!
系列文
後端攻略筆記13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言