在 GO 中,我了解到,
1)
程序员只能在命名类型(
X)或指向*X命名类型的指针()上定义方法2)
type 的显式方法定义
X隐式定义 type 的相同方法,*X反之亦然,所以,我的理解是,如果我声明,func (c Cat) foo(){ //do stuff_ }并声明,
func (c *Cat) foo(){ // do stuff_ }然后GO编译器给出,
Compile error: method re-declared这表明,指针方法是隐式定义的,反之亦然
使用给定的命名类型(
Cat),type Cat struct{ Name string Age int Children []Cat Mother *Cat }
方案 1
Method( )由程序员
foo在命名类型( ) 上定义,Catfunc (c Cat) foo(){ // do stuff.... }
fooGO 编译器在指针()上隐式定义方法(*Cat)到命名类型,看起来像,func (c *Cat) foo(){ // do stuff.... }关于创建命名类型(
Cat)的变量var c Cat var p *Cat = &c
c.foo()有程序员定义的方法。问题一:
在调用
p.foo()时,隐式指针方法是否接收到指针(p)?
方案 2
程序员在指向命名类型
foo的指针()上定义的方法( ),*Catfunc (c *Cat) foo(){ // do stuff.... }
foo由 GO 编译器在命名类型()上隐式定义方法( )Cat,看起来像,func (c Cat) foo(){ // do stuff.... }关于创建命名类型(
Cat)的变量var c Cat var p *Cat = &c
p.foo()有程序员定义的方法(上图)。问题2:
调用
c.foo()时,隐式非指针方法是否接收值c?