一尘不染

为什么带有指针接收器的方法在接收值时仍然可以工作?

go

我只是在环游世界中练习51练习。解释声称,该Scale方法在接收到a
Vertex而不是指向a的指针时无效Vertex

然而,当我改变声明v := &Vertex{3, 4},以v := Vertex{3, 4}main输出唯一的变化是丢失的&标记指针。

那么Scale,即使变量不是指针,为什么还要更改它收到的变量呢?


阅读 173

收藏
2020-07-02

共1个答案

一尘不染

它不会“接收”值。Go是强类型的,因此如果在某处指定了指向T的指针,则指向T(*T)的指针是唯一可以作为该类型位置的值出现的选项。

“魔术”在编译器中,可以在某些条件下有效地“重写”您的代码:

x.m()如果方法集(的类型)x包含m并且参数列表可以分配给的参数列表,则该方法调用有效m。如果x是可寻址的,并且&x的方法集包含mx.m()则表示(&x).m()

相关:方法集

2020-07-02