如果我们定义一个类型A, 并给它关联一个方法,然后就可以通过这个类型A的变量来调用这个方法了。
a := A{name: "go"}
a.Name()
这种调用方式其实是语法糖,实际上和调用 A.Name(a) 这个函数是一样的。 a.Name() 这里的变量a就是方法接受者,它会作为方法Name的第一个参数传入。
package main
import (
"fmt"
"reflect"
)
type A struct {
name string
}
func (a A) Name() string {
return a.name
}
func NameOfA(a A) string {
return a.name
}
func main() {
a := A{name: "go"}
fmt.Println(a.Name())
fmt.Println(A.Name(a))
t1 := reflect.TypeOf(A.Name)
t2 := reflect.TypeOf(NameOfA)
fmt.Println(t1 == t2) //true
}
Go语言中函数类型只和参数与返回值相关,上面代码 t1 与 t2 两个类型值相等就能构证明方法本质上就是普通的函数,而接受者就是隐含的第一个参数。