[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] 指针接收者实现接口是指 **结构体的方法的接收者是指针类型** 。结构体方法修改值得话,是影响原来得结构体的数据。
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra