我正在阅读这篇博文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 关注
- 173 浏览
添加回答
举报
0/150
提交
取消