GO - 隐式方法如何工作?

时间:2017-01-29 07:52:25

标签: pointers go methods structural-typing

  

在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

1 个答案:

答案 0 :(得分:5)

  1. An explicit method definition for type X implicitly defines the same method for type *X and vice versa.
  2. 这不正确。方法没有隐式定义。编译器为您做的唯一事情是隐式地将c.foo()替换为(*c).foo()c.foo()替换为(&c).foo()以方便使用。请参阅tour of Go

    1. 根据您的明确声明,方法的接收者是T型或* T型。