我只是在玩围棋巡回赛中的练习 51。该解释声称该Scale方法在接收 aVertex而不是指向 a 的指针时无效Vertex。然而,当我改变声明v := &Vertex{3, 4},以v := Vertex{3, 4}在main输出唯一的变化是丢失的&标记指针。那么为什么Scale即使变量不是指针也会改变它接收到的变量呢?
2 回答
红颜莎娜
TA贡献1842条经验 获得超12个赞
游览建议的区别实际上并不在于更改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
as的声明v := &Vertex{3, 4}
。
您会注意到,在第一种情况下,当方法采用指针时,输出为&{15 20} 25
. 但是,当这些方法采用值而不是指针时,输出为&{3 4} 5
。
在这两种情况下,v
都是指向Vertex
对象的指针。在第一种情况下,指针被传递给方法,一切都按预期进行 - 对Vertex
对象所做的任何修改都会对原始值进行,因此这些更改在方法返回后仍然存在。在第二种情况下,虽然v
仍然是一个指针,但 Go 编译器足够聪明,可以转换v.Scale(5)
为(*v).Scale(5)
, wherev
被取消引用,并将结果值传递给Scale
。
- 2 回答
- 0 关注
- 222 浏览
添加回答
举报
0/150
提交
取消