想像這樣一個場景:你是商店老闆,店裡來了三個客人。
人員A 拿出信用卡,人員B 用 PayPal,人員C 想付現金。
你要怎麼收錢?能不能用同台收銀機?套一句年輕人的話:「當然可以啦!」
在 Go 語言裡,interface 就像是收銀機的魔法合約:
「只要你會付錢,我都收!」
你想像所有付款方法都是「客人」。
客人從口袋掏出「付款方法卡」,然後對你說:「我會付錢!」
不同的客人,拿出不同卡片(信用卡、PayPal、現金)。
但他們都有一個共同點,就是「都會付錢」這件事。
所以你這個老闆不必管他們怎麼付,只要知道:
「喔,那你付錢吧!」
type Payment interface {
Pay(amount float64) string // 這就是付錢的魔法招式
}
type CreditCard struct {
cardNumber string
}
func (c CreditCard) Pay(amount float64) string {
return fmt.Sprintf("用信用卡付了 %.2f 元,刷掉錢錢!", amount)
}
type PayPal struct {
email string
}
func (p PayPal) Pay(amount float64) string {
return fmt.Sprintf("用 PayPal 付了 %.2f 元,輕鬆轉帳成功!", amount)
}
type Cash struct{}
func (c Cash) Pay(amount float64) string {
return fmt.Sprintf("用現金付了 %.2f 元,咚咚!錢包變輕了!", amount)
}
var payMethod Payment
payMethod = CreditCard{cardNumber: "1234-5678-9876-5432"}
fmt.Println(payMethod.Pay(1000))
payMethod = PayPal{email: "user@example.com"}
fmt.Println(payMethod.Pay(750))
payMethod = Cash{}
fmt.Println(payMethod.Pay(500))
執行結果:
用信用卡付了 1000.00 元,刷掉錢錢!
用 PayPal 付了 750.00 元,輕鬆轉帳成功!
用現金付了 500.00 元,咚咚!錢包變輕了!
這樣的彈性,程式就像會變魔術,可以隨時換不同的「道具」(付款方式),還不改變整個收銀流程。
就像魔法合約一樣,只要你有這項「指定技能」(Pay 方法),
不管你是什麼奇怪形狀或名字,我都一視同仁。
想像你現在要加一個「Apple Pay」的魔法卡片,你知道怎麼做了嗎?
只要寫一個新的 struct,實作 Pay
方法,加到原本的流程裡,就成功囉!