文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
方法表达式
如果 M 在类型 T 的方法集中。那么 T.M 就是能够正常调用的函数。使用与 M 相同的参数只是在参数列表的最前面增加了接收者参数。
MethodExpr = ReceiverType "." MethodName .
ReceiverType = TypeName | "(" "*" TypeName ")" | "(" ReceiverType ")" .
假设结构体 T 有两个方法。接收者类型为 T 的 Mv 方法和接收者类型为 *T 的 Mp 方法:
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
这个函数能够通过接收者正常调用,以下 5 种方式是等价的:
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)
。想创建一个绑定接收者的函数可以使用函数字面值或者方法值。
在接口类型中定义函数获取函数值是合法的。最终的函数调用会使用接口类型作为接收者。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论