大家好,讓我們來回顧一下關於 Go 的 interface 與多型魔法吧!透過這些題目,不只複習,也能檢驗自己是否真的懂了哦!
在 Go 裡,只要一個 struct 有實作 interface 裡定義的 _____ (方法名稱),就會自動成為該 interface 的一員。
type Payment interface {
Pay(amount float64) string
}
type Cash struct{}
func (c Cash) Pay(amount float64) string {
return "付了現金:" + fmt.Sprintf("%.2f元", amount)
}
func Checkout(p Payment, amount float64) {
fmt.Println(p.Pay(amount))
}
func main() {
c := Cash{}
Checkout(c, 300)
}
Checkout
函數一起使用。為什麼我們會建議用 interface 來管理多種付款方式,而不是寫很多 if 分支去判斷?
經過這次測驗,如果大部分題目答得出來,恭喜你已經理解 Go interface 的核心概念!
別忘了,interface 是讓你寫出乾淨、易擴展程式碼的關鍵魔法。
下次練習,可以試著加更多付款方式,或改寫 Checkout
讓它更智慧。加油!
以下是之前測驗題目的答案與解析,方便學生複習並理解 Go interface 的核心概念與應用:
在 Go 裡,只要一個 struct 有實作 interface 裡定義的 方法名稱(如 Pay),就會自動成為該 interface 的一員。
解析:Go 的介面實作是隱式的,不需明確宣告;只要方法符合就自動算實作成功。[9][10]
interface 需要 struct 顯式宣告「implements」才生效。❌
解析:Go 的 interface 實作完全隱式,不用寫 implements 關鍵字。
同一個 interface 變數,可以指向不同 struct 類型的實例。✔️
解析:這是 interface 多型的重點,interface 能包容多種具備相同行為的類型。
使用 interface 可以避免寫很多 if-else 判斷。✔️
解析:用 interface 多型,統一呼叫相同方法,不用判斷內部型別,程式碼簡潔。
interface 就是變數類型。✔️(部分正確)
解析:interface 是一種特殊的型別,代表帶有特定方法的集合,可以當作變數的型別。
加入新付款方式只要實作 Pay 方法就可以同舊系統配合。✔️
解析:只要新類型實作 interface 定義的方法,就能被舊代碼兼容使用。
程式碼輸出:
付了現金:300.00元
解析:
Cash struct 實作了 Payment interface 的 Pay 方法,Checkout 呼叫時執行該方法並輸出正確字串。