第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結(jié)構(gòu)嵌入實現(xiàn)的接口

結(jié)構(gòu)嵌入實現(xiàn)的接口

Go
倚天杖 2022-01-10 17:46:24
我對以下程序的實驗感到困惑,這些程序分別與使用結(jié)構(gòu)嵌入實現(xiàn)接口、命名類型和指針接收器有關(guān):package mainimport "fmt"type MyInt interface {    mytest()}type Base struct {}func (b *Base) mytest() {    fmt.Println("From base")}type Derived struct {    Base}type Derived2 struct {    *Base}func main() {    // Only this one has problem    // However, if we change mytest's receiver from *Base to Base, all the four assignments are OK    var _ MyInt = Derived{}    // OK    var _ MyInt = &Derived{}    var _ MyInt = Derived2{}    var _ MyInt = &Derived2{}}請參閱代碼中的注釋以了解我的困惑。有什么主要的方法來解釋它們嗎?
查看完整描述

2 回答

?
慕碼人8056858

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*,但反之則不然。這是因為指針接收器的方法可以期望能夠改變其接收器,但非指針接收器的方法不能。


查看完整回答
反對 回復(fù) 2022-01-10
?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊

根據(jù)您的代碼函數(shù) mytest 可以在指向 Base 的接收器上調(diào)用。

Struct Derived 繼承/嵌入 Base 和 Derived2 繼承/嵌入 *Base 即指向基址的指針。

為了

  1. var _MyInt = &Derived2{}:這里創(chuàng)建了 Derived2 的指針,并且由于 Derived2 繼承自 *Base,因此在 _MyInt 上調(diào)用 mytest 將起作用

  2. var _MyInt = Derived2{}:創(chuàng)建了 Derived2 的實例,并且由于 Derived2 繼承自 *Base,因此在 _MyInt 上調(diào)用 mytest 將起作用

  3. var _MyInt = &Derived{}:這里創(chuàng)建了 Derived 的指針,并且由于 Derived 從 Base 繼承,因此在 _MyInt 上調(diào)用 mytest 將起作用

  4. 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 組)。

希望這可以幫助


查看完整回答
反對 回復(fù) 2022-01-10
  • 2 回答
  • 0 關(guān)注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號