亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

GoLang 嵌入式結構類層次結構

GoLang 嵌入式結構類層次結構

Go
慕娘9325324 2021-09-13 19:51:26
我正在閱讀這篇博文http://www.hydrogen18.com/blog/golang-embedding.html并遇到了這些行這里有一個重要的區別需要注意。如果 myParent 是 Parent 的實例,則值 myParent 不能充當 Valueable。您必須使用值 &myParent(指向實例的指針)來充當 Valueable。這是因為 Value 方法接收的是 *Parent 而不是 Parent。我創建了一個示例https://play.golang.org/p/ojTKZfx97g。所以問題是為什么調用方法myparent.Value()本身可以工作,但在通過接口調用時不起作用
查看完整描述

2 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

您的callValueable(v Valueable)函數有一個類型Valueable為接口的參數:


type Valueable interface {

    Value() int64

}

您可以將任何實現此接口的值傳遞給它。您的Parent類型沒有,因為即使它有一個Value()方法,該方法也有一個指針接收器:


func (i *Parent) Value() int64{

    return i.value

}

并且根據Go語言規范(方法集和接口類型)的方法集Parent不包括這個方法,只包含了的方法集*Parent。引用規范:


...任何其他類型的方法集T由所有聲明為接收者類型的方法組成T。對應指針類型*T的方法集是所有用receiver *Tor聲明T的方法的集合(也就是包含了的方法集T)。


所以類型Parent沒有實現Valueable接口,但類型*Parent確實實現了它。


所以,你可以通過一個*Parent(一個指針來Parent)作為一個Valuable價值,你的方法,因為它實現了接口。您可以使用地址&運算符輕松獲取指針:


fmt.Println(callValueable(&myparent)) // This WORKS


查看完整回答
反對 回復 2021-09-13
  • 2 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號