繁体   English   中英

GoLang嵌入式struct类层次结构

[英]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 *TT声明的所有方法的集合(也就是说,它还包含T的方法集)。

因此类型Parent不实现Valueable接口,但类型*Parent确实实现了它。

所以,你可以传递一个*Parent (一个指向 Parent )作为一个Valuable价值,你的方法,因为它实现了接口。 您可以使用地址&运算符轻松获取指针:

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

根据Effective Go,如果值是可寻址的,则go将在调用指针接收器方法时自动插入&。

我对此做了进一步的研究,看起来我理解可寻址是错误的。 我在思考c ++这一行,而只要它是左值,那么它就是可寻址的。 但似乎在golang中并不是所有东西都是可以解决的

  • 存储在接口中的具体值不可寻址
  • map元素不可寻址

有趣的问题是为什么具体类型的接口不可寻址,以便golang可以自动执行&。 我找到了这个https://groups.google.com/forum/#!topic/golang-nuts/-ZoCu5m0kJ4 我引用了Steven Blenkinsop的答案,你可以在最后找到答案

在一个层面上,这是因为语言规范是这样说的。 但最终,是的,这是因为获取指针作为接收器传递的限制。 您不能获取接口内的值的地址,因为其类型可能会更改(您可以为接口分配不同类型的值),以及其他原因。 因此,如果您需要指针接收器,则指针本身需要位于接口中。

所以我看到接口或映射的方式,因为底层内存地址可能会由另一个线程改变,这就是为什么go不会自动为我们插入&因为它无法保证内存地址在整个函数调用生命周期中都是有效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM