在GO中,我了解到了,
1)
程序员只能将命名类型(
X
)或指针(*X
)上的方法定义为命名类型2)
类型
X
的显式方法定义隐式定义了类型*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
由程序员在命名类型(
foo
)上定义的方法(Cat
)func (c Cat) foo(){ // do stuff.... }
通过GO编译器隐式地将指针(
foo
)上的方法(*Cat
)定义为命名类型,看起来像,func (c *Cat) foo(){ // do stuff.... }
创建命名类型的变量(
Cat
)var c Cat var p *Cat = &c
c.foo()
具有程序员定义的方法。问题1:
在调用
p.foo()
时,隐式指针方法是否接收指针(p
)?
场景2
方法(
foo
)在程序员的指定类型的指针(*Cat
)上定义,func (c *Cat) foo(){ // do stuff.... }
通过GO编译器隐式定义命名类型(
foo
)上的方法(Cat
),看起来像,func (c Cat) foo(){ // do stuff.... }
创建命名类型的变量(
Cat
)var c Cat var p *Cat = &c
p.foo()
具有程序员定义的方法(上图)。问题2:
在调用
c.foo()
时,隐式非指针方法是否收到值c
?
答案 0 :(得分:5)
An explicit method definition for type X implicitly defines the same method for type *X and vice versa.
这不正确。方法没有隐式定义。编译器为您做的唯一事情是隐式地将c.foo()
替换为(*c).foo()
或c.foo()
替换为(&c).foo()
以方便使用。请参阅tour of Go