返回介绍

方法值

发布于 2024-10-12 12:51:51 字数 1479 浏览 0 评论 0 收藏 0

如果表达式 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文