[英]Why does a method with a pointer receiver still work when it receives a value?
我只是在环游世界中练习51练习 。 解释声称Scale
方法在接收到Vertex
而不是指向Vertex
的指针时无效。
然而,当我改变声明v := &Vertex{3, 4}
以v := Vertex{3, 4}
在main
输出唯一的变化是缺失&
来标记指针。
那么,即使变量不是指针,为什么Scale
也会更改它收到的变量?
游览建议的区别实际上不是将v := &Vertex{3, 4}
更改为v:= Vertex{3, 4}
,而是更改了这两种方法的定义,以便它们使用值而不是值指针。 因此,例如,对于Scale
, func (v *Vertex) Scale(f float64) {...
变为func (v Vertex) Scale(f float64) {...
(请注意(v *Vertex)
,一个指针值,变为(v Vertex)
,一个非指针值)。 在这两种情况下,都应将v
的声明保留为v := &Vertex{3, 4}
。
您会注意到,在第一种情况下,当方法使用指针时,输出为&{15 20} 25
。 但是,当方法采用值而不是指针时,输出为&{3 4} 5
。
在这两种情况下, v
都是指向Vertex
对象的指针。 在第一种情况下,将指针传递给方法,并且一切都按预期工作-对Vertex
对象所做的任何修改都将对原始值进行,因此这些更改在方法返回后仍然存在。 在第二种情况下,尽管v
仍然是指针,但是Go编译器足够聪明,可以将v.Scale(5)
转换为(*v).Scale(5)
,其中v
被取消引用,并将结果值传递给Scale
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.