2017-01-29 21 views
0

在GO,我瞭解到,GO - 隱式方法是如何工作的?

1)

程序員可以只定義上命名的類型(X)或指針(*X)的方法來命名的類型

2)

X類型的顯式方法定義隱式定義了類型*X的相同方法,反之亦然,因此,我的小寫安定是,如果我聲明,

func (c Cat) foo(){ 
    //do stuff_ 
} 

和聲明,

func (c *Cat) foo(){ 
    // do stuff_ 
} 

然後去編譯器爲,

Compile error: method re-declared

這表明,指針方法隱含定義和副通用


在給定的命名類型(Cat

type Cat struct{ 
    Name string 
    Age int 
    Children []Cat 
    Mother *Cat 
} 

方案1

方法(foo)上命名類型定義(Cat ),b ÿ程序員,

func (c Cat) foo(){ 
    // do stuff.... 
} 

隱含定義了指針(*Cat)方法(foo)到名爲型,由GO編譯器,看起來像,

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

即隱式地定義方法( foo)在GO編譯器中的命名類型(Cat)像,

func (c Cat) foo(){ 
    // do stuff.... 
    } 

在命名的類型(Cat)的創建變量

var c Cat 
var p *Cat = &c 

p.foo()已經由程序員(上述)所定義的方法。

問題2:

在調用c.foo(),並隱式非指針方法接收所述值c

+0

我希望你得到方法所期望的類型。但是你爲什麼不嘗試它,看看在你用指針方法修改它之後結構是否改變? –

+0

@ZanLynx我試過,我的觀察說,** 1)**隱式指針方法接收指向的值,但不是指針。 ** 2)**隱式指針方法接收指向值的指針,但不接受值。 *這對我來說有點困惑,理解,爲什麼它會以相反的方式發生?從邏輯上講,應該如問題1&2 * – overexchange

+0

中所述,我認爲以下答案來自@ dev.bmax,因爲它部分不正確。休息是你的 – overexchange

回答

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()。請參閱tour of Go

  1. 根據您的顯式聲明,該方法的接收方是T型或T型。
+0

評論不適用於擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/134311/discussion-on-answer-by-dev-bmax-go-how-does-an-implicit-method-work) 。 –