指针作为 receiver
现在让回过头来看看 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论