跳到主要内容

go-方法

Go 的方法本质上也是函数,只是方法会绑定到某个类型

  • 方法本质上也是函数的一种,只不过它属于某个类型
  • 在函数声明时,在其名字之前放上一个类型,即是一个方法
  • 方法属于某个类型,方法绑定到某个类型(通常是 struct)
  • 方法属于某个类型的方法集,因此可以隐式实现接口

方法和函数区别​

  • 方法 = 函数 + 接收者
go
// 函数:普通参数,不绑定类型
func Bark(name string) {
fmt.Println(name, "汪汪")
}

// 方法:(d Dog) 是接收者,绑定到 Dog 类型
func (d Dog) Speak() {
fmt.Println(d.Name, "汪汪")
}

方法的定义​

  • 如下这2种写法的区别:接收者有没有变量名
  • 可以将类型可以绑定到指定的变量名
go
type Dog struct {
Name string
}

// 表示接收者变量叫 d,类型是 Dog
func (d Dog) Speak() {
fmt.Println(d.Name)
}

// 接收者是 Dog,只是不给它起变量名
// 因为方法内部不需要用到这个具体对象
func (Dog) Speak() {}

方法绑定类型作用​

  • 定义一个方法,需要绑定类型
  • 如果不绑定类型,那么就是个普通函数,方法对于函数来说,就是多了个绑定类型
  • 方法绑定类型目的
    • 将数据和行为关联
    • 实现接口,隐式接口实现
    • 可以控制数据修改权限

方法绑定类型例子​

方法绑定到某个类型上之后,就可以直接通过类型来调用方法

  • Speak这个方法是绑定在 Dog 类型上的
  • 当方法绑定到某个类型后,就可以通过“这个类型的值”来调用这个方法
go
type Dog struct{}

func (Dog) Speak() {
fmt.Println("汪汪")
}

func MakeSound(d Dog) {
d.Speak()
}

值接收者 vs 指针接收者​

  • 值接收者:方法操作的是原数据的一个副本,适合只读操作,安全且不会修改原对象
  • 指针接收者:方法操作的是原数据的内存地址,允许方法内部修改对象的状态