在 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
在命名类型( ) 上定义,Cat
func (c Cat) foo(){ // do stuff.... }
foo
GO 编译器在指针()上隐式定义方法(*Cat
)到命名类型,看起来像,func (c *Cat) foo(){ // do stuff.... }
关于创建命名类型(
Cat
)的变量var c Cat var p *Cat = &c
c.foo()
有程序员定义的方法。问题一:
在调用
p.foo()
时,隐式指针方法是否接收到指针(p
)?
方案 2
程序员在指向命名类型
foo
的指针()上定义的方法( ),*Cat
func (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
?