[英]GoLang embedded struct class hierarchy
我正在阅读这篇博文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()可以自己工作,但是在通过接口调用时不起作用
您的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*T
或T
声明的所有方法的集合(也就是说,它还包含T
的方法集)。
因此类型Parent
不实现Valueable
接口,但类型*Parent
确实实现了它。
所以,你可以传递一个*Parent
(一个指向 Parent
)作为一个Valuable
价值,你的方法,因为它实现了接口。 您可以使用地址&
运算符轻松获取指针:
fmt.Println(callValueable(&myparent)) // This WORKS
根据Effective Go,如果值是可寻址的,则go将在调用指针接收器方法时自动插入&。
我对此做了进一步的研究,看起来我理解可寻址是错误的。 我在思考c ++这一行,而只要它是左值,那么它就是可寻址的。 但似乎在golang中并不是所有东西都是可以解决的
有趣的问题是为什么具体类型的接口不可寻址,以便golang可以自动执行&。 我找到了这个https://groups.google.com/forum/#!topic/golang-nuts/-ZoCu5m0kJ4 。 我引用了Steven Blenkinsop的答案,你可以在最后找到答案
在一个层面上,这是因为语言规范是这样说的。 但最终,是的,这是因为获取指针作为接收器传递的限制。 您不能获取接口内的值的地址,因为其类型可能会更改(您可以为接口分配不同类型的值),以及其他原因。 因此,如果您需要指针接收器,则指针本身需要位于接口中。
所以我看到接口或映射的方式,因为底层内存地址可能会由另一个线程改变,这就是为什么go不会自动为我们插入&因为它无法保证内存地址在整个函数调用生命周期中都是有效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.