我只是在玩围棋中的练习 51。该解释声称该Scale方法在接收到 aVertex而不是指向 a 的指针时无效Vertex。
然而,当我将声明更改v := &Vertex{3, 4}为v := Vertex{3, 4}inmain时,输出中的唯一变化是缺少&标记指针。
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),非指针值)。在这两种情况下,您都应该保留vas的声明v := &Vertex{3, 4}。
您会注意到,在第一种情况下,当方法采用指针时,输出为&{15 20} 25. 但是,当方法采用值而不是指针时,输出为&{3 4} 5.
在这两种情况下,v都是指向Vertex对象的指针。Vertex在第一种情况下,指针被传递给方法,并且一切都按预期工作 - 对对象所做的任何修改都对原始值进行,因此这些更改在方法返回后仍然存在。在第二种情况下,尽管v它仍然是一个指针,但 Go 编译器足够聪明,可以转换v.Scale(5)为(*v).Scale(5),v取消引用,并将结果值传递给Scale。