我正在閱讀這篇博文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
- 2 回答
- 0 關注
- 194 瀏覽
添加回答
舉報
0/150
提交
取消