Go 接口方法返回自己类型的值
我正在尝试创建一个方法,该方法将接受特定类型的结构并对其执行操作。然而,我需要一个可以调用stuct实例的方法,它将返回该结构类型的对象。我得到一个编译时错误,因为实现接口的类型的返回类型与接口的方法返回类型不同,但这是因为接口需要返回它自己类型的值 接口声明:Go 接口方法返回自己类型的值,go,interface,Go,Interface,我正在尝试创建一个方法,该方法将接受特定类型的结构并对其执行操作。然而,我需要一个可以调用stuct实例的方法,它将返回该结构类型的对象。我得到一个编译时错误,因为实现接口的类型的返回类型与接口的方法返回类型不同,但这是因为接口需要返回它自己类型的值 接口声明: type GraphNode interface { Children() []GraphNode IsGoal() bool GetParent() GraphNode SetParent(GraphN
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)唯一原型中是否应出现在接收器中?其他所有内容是否应为接口类型?