🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] 在结构体那一章节中,我们介绍了在定义结构体方法时既可以使用值接收者也可以使用指针接收者。那么对于实现接口来说使用值接收者和使用指针接收者有什么区别呢?接下来我们通过一个例子看一下其中的区别。 ## 值接收者实现接口 ```go // Penson 是人类的结构体 type Penson struct { name string } // Move 是人类跑的方法 func (p Penson) Move() { fmt.Printf("%s在跑~\n", p.name) } // Animal 是动物的结构体 type Animal struct { Species string } // Move 是动物跑的方法 func (a Animal) Move() { fmt.Printf("%s在跑~\n", a.Species) } // Mover 是跑的接口 type Mover interface { Move() } func main() { dog := Animal{"狗"} var d Mover = dog d.Move() } // 运行结果 // 狗在跑~ ``` >[info] 值接收者实现接口是指 **结构体的方法的接收者是值类型** 。结构体方法修改值得话,并不影响原来得结构体的数据。 ## 指针接收者实现接口 ```go // WeChat 是微信结构体 type WeChat struct { ID int User string Balance float64 } // Pay 是微信结构体的付款方法 func (w *WeChat) Pay(f float64) { w.Balance -= f fmt.Printf("%s用户微信扣款%.2f元,余额%f元\n", w.User, f, w.Balance) } // Alipay 是支付宝结构体 type Alipay struct { ID int User string Balance float64 } // Pay 是支付宝结构体的付款方法 func (a *Alipay) Pay(f float64) { a.Balance -= f fmt.Printf("%s用户支付宝扣款%.2f元,余额%.2f元\n", a.User, f, a.Balance) } // Payer 结账接口 type SettleAccounter interface { Pay(float64) } func main() { dog := Animal{"狗"} var d Mover = dog d.Move() a := Alipay{1, "jiaxzeng", 100} var pay SettleAccounter = &a pay.Pay(15.659) fmt.Printf("%s用户余额剩余%.2f元\n", a.User, a.Balance) } // 运行结果 // jiaxzeng用户支付宝扣款15.66元,余额84.34元 // jiaxzeng用户余额剩余84.34元 ``` >[info] 指针接收者实现接口是指 **结构体的方法的接收者是指针类型** 。结构体方法修改值得话,是影响原来得结构体的数据。