Calling a method with a pointer receiver by an object instead of a pointer to it?

后端 未结 2 2129
猫巷女王i
猫巷女王i 2020-12-01 22:50

v is an object of Vertex, and Scale is a method for a pointer to Vertex. Then why is v.Scale(10) not wrong,

相关标签:
2条回答
  • 2020-12-01 23:06

    Spec: Calls:

    A method call x.m() is valid if the method set of (the type of) x contains m and the argument list can be assigned to the parameter list of m. If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().

    The compiler sees that Scale() has a pointer receiver and also that v is addressable (as it is a local variable), so v.Scale(10) will be interpreted as (&v).Scale(10).

    This is just one of the many conveniences the spec offers you so the source code can remain clean.

    0 讨论(0)
  • 2020-12-01 23:10

    It's the Go automatic dereferencing:

    From https://golang.org/ref/spec#Method_values:

    As with selectors, a reference to a non-interface method with a value receiver using a pointer will automatically dereference that pointer: pt.Mv is equivalent to (*pt).Mv.

    0 讨论(0)
提交回复
热议问题