既然golang的method并不是对象的成员,那么它是怎么和对象绑定的呢?
答案是通过receiver,我想了解的更深入一些。
我目前查到的资料只是说method和function没有什么不同,只不过method多了一个receiver,调用method的时候会把receiver当作参数传给method这个函数。介绍也就到这个层面就结束了。
但是,显然
method: func (r *receiver)SetName(name string)
和
function: func SetName(r *receiver, name string)
是不一样的,并不等价。
而且多个method可以有相同的函数名,只要receiver不同,
func (p *Person)SetName(name string)
func (a *Animal)SetName(name string)
但是function却不能重名函数,哪怕参数不同(即不存在C++中的函数重载概念)。
func SetName(p *Person, name string)
func SetName(a *Animal, name string) //err: SetName redeclared
换个角度问的话就是:
当我定义了一个method的时候golang是怎么存储它的?
当我使用了选择子的时候p.SetName,golang是如何找到method的?