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

sja*_*obi 5 methods pointers go

我刚刚参加了Tour of Go中的练习51.该解释声称该Scale方法在接收到Vertex而不是指向a的指针时没有效果Vertex.

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

那么为什么Scale即使变量不是指针也改变它收到的变量?

zzz*_*zzz 8

它没有"收到"一个值.Go是强类型的,因此如果在某处指定了指向T的指针,则指向T(*T)的指针是唯一可以作为此类型位置的值发生的选项.

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

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

相关:方法集

  • 不,`Scale`**不能**将非指针视为指针.答案中的规格摘录解释了为什么`Scale`会将`&v`作为接收者,**而不是**`v`. (2认同)