如果M在T类型的方法集中,T.M是一个函数
可作为常规函数调用,其参数与 M 前缀相同
通过作为方法接收者的附加参数。
MethodExpr = ReceiverType "." MethodName .
ReceiverType = TypeName | "(" "*" TypeName ")" | "(" ReceiverType ")" .
考虑一个结构类型T,有两个方法Mv,它的接收者是
类型T,和Mp,其接收者类型为*T。
type T struct {
a int
}
func (tv T) Mv(a int) int { return 0 } // value receiver
func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver
var t T
表达式
T.Mv
产生一个等效于Mv的函数,但有一个明确的接收者作为
它的第一个论点;它有签名
func(tv T, a int) int
该函数可以通过显式接收器正常调用,所以
这五个调用是等价的:
t.Mv(7)
T.Mv(t, 7)
(T).Mv(t, 7)
f1 := T.Mv; f1(t, 7)
f2 := (T).Mv; f2(t, 7)
同样,表达式
(*T).Mp
产生一个函数值,用签名表示 Mp
func(tp *T, f float32) float32
对于带有值接收器的方法,可以派生一个带有
显式指针接收器,所以
(*T).Mv
产生一个代表Mv的函数值,带有签名
func(tv *T, a int) int
这样的函数通过接收器间接创建一个值
作为接收者传递给底层方法;该方法不
覆盖函数调用中传递地址的值。
最后一种情况,指针接收器的值接收器函数
方法,是非法的,因为指针接收器方法不在
值类型的方法集。
从方法派生的函数值通过函数调用来调用
句法;接收者作为调用的第一个参数提供。
也就是说,给定f := T.Mv,f 被调用为f(t, 7) 而不是t.f(7)。至
构造一个绑定接收者的函数,使用函数字面量
或方法值。
从接口的方法派生函数值是合法的
类型。生成的函数需要一个明确的接收者
接口类型。