Go 接口方法返回自己类型的值

Go 接口方法返回自己类型的值,go,interface,Go,Interface,我正在尝试创建一个方法,该方法将接受特定类型的结构并对其执行操作。然而,我需要一个可以调用stuct实例的方法,它将返回该结构类型的对象。我得到一个编译时错误,因为实现接口的类型的返回类型与接口的方法返回类型不同,但这是因为接口需要返回它自己类型的值 接口声明: type GraphNode interface { Children() []GraphNode IsGoal() bool GetParent() GraphNode SetParent(GraphN

我正在尝试创建一个方法,该方法将接受特定类型的结构并对其执行操作。然而,我需要一个可以调用stuct实例的方法,它将返回该结构类型的对象。我得到一个编译时错误,因为实现接口的类型的返回类型与接口的方法返回类型不同,但这是因为接口需要返回它自己类型的值

接口声明:

type GraphNode interface {
    Children() []GraphNode
    IsGoal() bool
    GetParent() GraphNode
    SetParent(GraphNode) GraphNode
    GetDepth() float64
    Key() interface{}
}
实现该接口的类型:

type Node struct {
    contents []int
    parent   *Node
    lock     *sync.Mutex
}

func (rootNode *Node) Children() []*Node {
...
}
错误消息:

.\astar_test.go:11: cannot use testNode (type *permutation.Node) as type GraphNode in argument to testGraph.GetGoal:
*permutation.Node does not implement GraphNode (wrong type for Children method)
have Children() []*permutation.Node
want Children() []GraphNode
获取父对象的方法:

func (node *Node) GetParent() *Node {
    return node.parent
}

上述方法失败,因为它返回指向节点的指针,并且接口返回类型GraphNode。

*node
未实现
GraphNode
接口,因为
Children()
的返回类型与接口中定义的类型不同。即使
*节点
实现了
图形节点
,也不能在需要
[]图形节点
的地方使用
[]*节点
。您需要声明
Children()
以返回
[]图形节点
。类型为
[]GraphNode
的切片的元素可以是类型为
*Node

对于
GetParent()
,只需将其更改为:

func (node *Node) GetParent() GraphNode {
    return node.parent
}

*节点
未实现
图形节点
接口,因为
子节点()的返回类型与接口中定义的返回类型不同。即使
*节点
实现了
图形节点
,也不能在需要
[]图形节点
的地方使用
[]*节点
。您需要声明
Children()
以返回
[]图形节点
。类型为
[]GraphNode
的切片的元素可以是类型为
*Node

对于
GetParent()
,只需将其更改为:

func (node *Node) GetParent() GraphNode {
    return node.parent
}

儿童接收器是否也应为GraphNode类型?否则,当我有一个在节点上调用的方法并返回修改后的节点时,我需要将其强制转换到GraphNode接口,这是没有意义的。不,接收器应该是您编写的实际类型。这和其他接口方法定义使您的类型成为接口的实现。对于返回类型为
GraphNode
的值的接口方法,您可以返回类型为
*Node
的值,因为该类型实现了接口。因此,要确认,只有在返回节点/图形节点的切片时才会出现问题?您的方法定义必须与接口定义完全匹配(名称、参数类型、返回类型)。
GetParent
必须返回
GraphNode
,但在函数中,您可以返回类型为
*Node
的值。如果不清楚,很抱歉。好的。因此在我的接口实现中,我的类型名称(Node)的唯一位置原型中是否应该出现在接收器中?其他所有内容都应该是接口类型?儿童接收器是否也应该是GraphNode类型?否则,当我有一个在节点上调用的方法并返回修改后的节点时,我需要将其强制转换为GraphNode接口,这没有真正意义。不,接收器应该e您编写的实际类型。这和其他接口方法定义使您的类型成为接口的实现。对于返回值类型为
GraphNode
的接口方法,您可以返回值类型为
*Node
,因为该类型实现了接口。因此,要确认,问题仅限于返回节点/图形节点的切片时出现y?方法定义必须与接口定义完全匹配(名称、参数类型、返回类型).
GetParent
必须返回
GraphNode
,但在函数中,您可以返回类型为
*Node
的值。如果不清楚,很抱歉。好的。因此,在我的接口实现中,我的类型名称(Node)唯一原型中是否应出现在接收器中?其他所有内容是否应为接口类型?