文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
方法值
如果表达式 x 拥有静态类型 T 并且 M 在类型 T 的方法集中。x.M 叫做方法值。方法值 x.M
是一个函数值,这个函数和 x.M 拥有相同的参数列表。表达式 x 在计算方法值时会被保存和计算,这个拷贝的副本会作为任何接下来调用的接收者。
类型 T 可能是接口类型也可能不是接口类型。
与方法表达式中讲过的一样,假设类型 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
var pt *T
func makeT() T
表达式:
t.Mv
生成一个类型的函数值:
func(int) int
以下两种调用是等价的:
t.Mv(7)
f := t.Mv; f(7)
相似的,表达式:
pt.Mp
生成一个类型的函数值:
func(float32) float32
与选择器相同,使用指针调用以值作为接收者的非接口方法会自动将指针解引用: pt.Mv
等价于 (*pt).Mv
。
与方法调用相同,使用值调用以指针作为接收者的非接口方法会自动对值取址: pt.Mv
等价于 (&pt).Mv
。
f := t.Mv; f(7) // like t.Mv(7)
f := pt.Mp; f(7) // like pt.Mp(7)
f := pt.Mv; f(7) // like (*pt).Mv(7)
f := t.Mp; f(7) // like (&t).Mp(7)
f := makeT().Mp // invalid: result of makeT() is not addressable
尽管上面使用的都是非接口类型的例子,不过对于接口类型同样适用。
var i interface { M(int) } = myVal
f := i.M; f(7) // like i.M(7)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论