我正在阅读此博客文章http://www.hydrogen18.com/blog/golang-embedding.html,遇到了这些问题

There is an important distinction to observe here. If myParent is an instance of Parent the value myParent cannot act as a Valueable. You must use the the value &myParent, a pointer to the instance, to act as a Valueable. This is because the method Value receives a *Parent not a Parent.

我创建了一个示例https://play.golang.org/p/ojTKZfx97g。因此,问题在于为什么调用方法myparent.Value()本身可以工作,但通过interface

调用时却不起作用


根据有效执行,如果该值是可寻址的,则执行将自动插入


您的callValueable(v Valueable)函数具有类型Valueable的参数,该参数是接口:

1
2
3
type Valueable interface {
    Value() int64
}

您可以将实现此接口的任何值传递给它。您的Parent类型没有,因为即使它具有Value()方法,该方法也具有指针接收器:

1
2
3
func (i *Parent) Value() int64{
    return i.value
}

并且根据Go语言规范(方法集和接口类型),Parent的方法集不包括此方法,仅包括*Parent的方法集。引用规格:

...The method set of any other type T consists of all methods declared with receiver type T. The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).

因此类型Parent不能实现Valueable接口,但是类型*Parent可以实现它。

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

1
fmt.Println(callValueable(&myparent)) // This WORKS
  • 谢谢icza。我认为问题的症结在于为什么golang无法自动插入