接口方法返回自有类型

时间:2017-03-05 23:15:52

标签: go interface

我正在尝试创建一个方法,它将采用某种类型的结构并对它们进行操作。但是,我需要一个可以调用stuct实例的方法,它将返回该struct类型的对象。我得到一个编译时错误,因为实现接口的类型的返回类型与接口的方法返回类型不同,但那是因为接口需要返回它自己类型的值。

接口声明:

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。

1 个答案:

答案 0 :(得分:3)

*Node未实现GraphNode接口,因为Children()的返回类型与接口中定义的返回类型不同。即使*Node实施GraphNode,您也无法使用期望[]*Node的{​​{1}}。您需要声明[]GraphNode才能返回Children()[]GraphNode类型切片的元素可以是[]GraphNode类型。

对于*Node,只需将其更改为:

GetParent()