go-方法
Go 的方法本质上也是函数,只是方法会绑定到某个类型
- 方法本质上也是函数的一种,只不过它属于某个类型
- 在函数声明时,在其名字之前放上一个类型,即是一个方法
- 方法属于某个类型,方法绑定到某个类型(通常是 struct)
- 方法属于某个类型的方法集,因此可以隐式实现接口
方法和函数区别
- 方法 = 函数 + 接收者
// 函数:普通参数,不绑定类型
func Bark(name string) {
fmt.Println(name, "汪汪")
}
// 方法:(d Dog) 是接收者,绑定到 Dog 类型
func (d Dog) Speak() {
fmt.Println(d.Name, "汪汪")
}
方法的定义
- 如下这2种写法的区别:接收者有没有变量名
- 可以将类型可以绑定到指定的变量名
type Dog struct {
Name string
}
// 表示接收者变量叫 d,类型是 Dog
func (d Dog) Speak() {
fmt.Println(d.Name)
}
// 接收者是 Dog,只是不给它起变量名
// 因为方法内部不需要用到这个具体对象
func (Dog) Speak() {}
方法绑定类型作用
- 定义一个方法,需要绑定类型
- 如果不绑定类型,那么就是个普通函数,方法对于函数来说,就是多了个绑定类型
- 方法绑定类型目的
- 将数据和行为关联
- 实现接口,隐式接口实现
- 可以控制数据修改权限
方法绑定类型例子
方法绑定到某个类型上之后,就可以直接通过类型来调用方法
Speak这个方法是绑定在Dog类型上的- 当方法绑定到某个类型后,就可以通过“这个类型的值”来调用这个方法
type Dog struct{}
func (Dog) Speak() {
fmt.Println("汪汪")
}
func MakeSound(d Dog) {
d.Speak()
}
值接收者 vs 指针接收者
- 值接收者:方法操作的是原数据的一个副本,适合只读操作,安全且不会修改原对象
- 指针接收者:方法操作的是原数据的内存地址,允许方法内部修改对象的状态