GO - 隐式方法如何工作?

ove*_*nge 0 methods pointers go structural-typing

在GO中,我了解到,

1)

程序员只能将命名类型(X)或指针(*X)的方法定义为命名类型

2)

类型明确的方法定义X隐含定义了相同的方法类型*X反之亦然,所以,我的理解是,如果我宣布,

func (c Cat) foo(){
  //do stuff_
} 
Run Code Online (Sandbox Code Playgroud)

并宣布,

func (c *Cat) foo(){
  // do stuff_
}
Run Code Online (Sandbox Code Playgroud)

然后GO编译器给出,

Compile error: method re-declared

这表明,指针方法是隐式定义的,反之亦然


使用给定的命名类型(Cat),

type Cat struct{
  Name string
  Age int
  Children []Cat
  Mother *Cat
} 
Run Code Online (Sandbox Code Playgroud)

场景1

方法(foo)Cat由程序员在命名类型()上定义,

func (c Cat) foo(){
   // do stuff....
}
Run Code Online (Sandbox Code Playgroud)

通过GO编译器隐式地将foo指针*Cat类型的指针()定义为命名类型,看起来像,

func (c *Cat) foo(){
   // do stuff....
}
Run Code Online (Sandbox Code Playgroud)

关于创建命名类型的变量(Cat)

var c Cat
var p *Cat = &c
Run Code Online (Sandbox Code Playgroud)

c.foo() 有程序员定义的方法.

问题1:

在调用时p.foo(),隐式指针方法是否接收指针(p)?


情景2

方法(foo)*Cat在程序员的指定类型的指针()上定义,

func (c *Cat) foo(){
   // do stuff....
  }
Run Code Online (Sandbox Code Playgroud)

通过GO编译器隐式定义foo命名类型(Cat)的method(),看起来像,

func (c Cat) foo(){
   // do stuff....
  }
Run Code Online (Sandbox Code Playgroud)

关于创建命名类型的变量(Cat)

var c Cat
var p *Cat = &c
Run Code Online (Sandbox Code Playgroud)

p.foo() 具有由程序员定义的方法(上面).

问题2:

在调用时c.foo(),隐式非指针方法是否接收到值c

dev*_*max 5

  1. 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()为了方便.参观Go

  1. 根据您的显式声明,方法的接收者是T类型或*T类型.