0

在 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....
}

fooGO 编译器在指针()上隐式定义方法(*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

4

1 回答 1

5
  1. An explicit method definition for type X implicitly defines the same method for type *X and vice versa.

这是不正确的。方法不是隐式定义的。编译器为您做的唯一一件事就是为了方便隐式替换c.foo()with(*c).foo()c.foo()with 。(&c).foo()围棋之旅

  1. 根据您的显式声明,该方法的接收者是 T 类型或 *T 类型。
于 2017-01-29T09:48:09.227 回答