2 回答

TA貢獻(xiàn)1803條經(jīng)驗 獲得超6個贊
來自Go 語言規(guī)范:
給定一個結(jié)構(gòu)類型 S 和一個名為 T 的類型,提升的方法包含在結(jié)構(gòu)的方法集中,如下所示:
如果 S 包含匿名字段 T,則 S 和 *S 的方法集都包含帶有接收者 T 的提升方法。
*S 的方法集還包括帶有接收者 *T 的提升方法。
如果 S 包含匿名字段 *T,則 S 和 *S 的方法集都包含帶有接收者 T 或 *T 的提升方法。
在您的代碼中不起作用的情況:
var _ MyInt = Derived{}
這里的方法集Derived
(其中包含一個匿名字段Base
)包括Base
規(guī)則 1mytest
的方法。由于是一個方法*Base
而不是Base
,它被提升為一個方法*Derived
(根據(jù)第二條規(guī)則),但不是Derived
。
為什么會這樣?嗯,它類似于結(jié)構(gòu)方法集的規(guī)則:方法T
也是 的方法T*
,但反之則不然。這是因為指針接收器的方法可以期望能夠改變其接收器,但非指針接收器的方法不能。

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊
根據(jù)您的代碼函數(shù) mytest 可以在指向 Base 的接收器上調(diào)用。
Struct Derived 繼承/嵌入 Base 和 Derived2 繼承/嵌入 *Base 即指向基址的指針。
為了
var _MyInt = &Derived2{}:這里創(chuàng)建了 Derived2 的指針,并且由于 Derived2 繼承自 *Base,因此在 _MyInt 上調(diào)用 mytest 將起作用
var _MyInt = Derived2{}:創(chuàng)建了 Derived2 的實例,并且由于 Derived2 繼承自 *Base,因此在 _MyInt 上調(diào)用 mytest 將起作用
var _MyInt = &Derived{}:這里創(chuàng)建了 Derived 的指針,并且由于 Derived 從 Base 繼承,因此在 _MyInt 上調(diào)用 mytest 將起作用
var _MyInt = Derived{}:創(chuàng)建了 Derived 的實例,并且由于 Derived 從 Base 繼承,因此在 _MyInt 上調(diào)用 mytest 將不起作用,因此需要指向 Base 的指針。
您正確地指出,將接收器從 *Base 更改為 Base 將起作用,因為 Go 將能夠從指針中識別 Object 并且能夠調(diào)用 mytest.
根據(jù) golang 規(guī)范,一個類型可能有一個與之關(guān)聯(lián)的方法集。接口類型的方法集就是它的接口。任何其他類型 T 的方法集由所有以接收者類型 T 聲明的方法組成。對應(yīng)指針類型 *T 的方法集是所有以接收者 *T 或 T 聲明的方法的集合(即它還包含該方法T 組)。
希望這可以幫助
- 2 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報