返回介绍

指针作为 receiver

发布于 2024-10-12 12:35:54 字数 897 浏览 0 评论 0 收藏 0

现在让回过头来看看 SetColor 这个 method,它的 receiver 是一个指向 Box 的指针,可以使用*Box。

定义 SetColor 的真正目的是想改变这个 Box 的颜色,如果不传 Box 的指针,那么 SetColor 接受的其实是 Box 的一个 copy,也就是说 method 内对于颜色值的修改,其实只作用于 Box 的 copy,而不是真正的 Box。所以需要传入指针。

这里可以把 receiver 当作 method 的第一个参数来看,然后结合前面函数讲解的传值和传引用就不难理解

这里也许会问 SetColor 函数里面应该这样定义 *b.Color=c ,而不是 b.Color=c ,需要读取到指针相应的值。

其实 Go 里面这两种方式都是正确的,当用指针去访问相应的字段时(虽然指针没有任何的字段),Go 知道要通过指针去获取这个值。PaintItBlack 里面调用 SetColor 的时候是不是应该写成 (&bl[i]).SetColor(BLACK) ,因为 SetColor 的 receiver 是*Box,而不是 Box。这两种方式都可以,因为 Go 知道 receiver 是指针,他自动转了。

也就是说:

如果一个 method 的 receiver 是*T,可以在一个 T 类型的实例变量 V 上面调用这个 method,而不需要&V 去调用这个 method

类似的

如果一个 method 的 receiver 是 T,可以在一个*T 类型的变量 P 上面调用这个 method,而不需要 *P 去调用这个 method

所以不用担心是调用的指针的 method 还是不是指针的 method,Go 知道要做的一切,这对于有多年 C/C++编程经验的同学来说,真是解决了一个很大的痛苦。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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