为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信