在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
?
我希望你得到方法所期望的類型。但是你爲什麼不嘗試它,看看在你用指針方法修改它之後結構是否改變? –
@ZanLynx我試過,我的觀察說,** 1)**隱式指針方法接收指向的值,但不是指針。 ** 2)**隱式指針方法接收指向值的指針,但不接受值。 *這對我來說有點困惑,理解,爲什麼它會以相反的方式發生?從邏輯上講,應該如問題1&2 * – overexchange
中所述,我認爲以下答案來自@ dev.bmax,因爲它部分不正確。休息是你的 – overexchange