[英]Golang type assertion with pointers
我一直在使用一个界面来用作分层树。 这个想法是大声调用.Children()
、 .Father()
的具体实现以及一个基于{id, FatherId}
架构切片自动填充层次结构的函数。
我只需要这个接口的三个不同的实现,也许为每个结构做整个事情更方便,但我是 Go 的新手,决定使用这个例子来理解接口。
我来到了一个看起来像这样的界面:
type Node interface{
Equals(nodo *Node) bool
AddChild(child *Node)
SetFather(father *Node)
Children() []Node
Father() *Node
}
所以这个想法是调用一个Populate
函数:
func Populate(plainNodes []Node, HierarchichalNodes *[]Node) {}
普通节点将是定义他父亲 id 的项目:
{id: "Animal", father: ""}
{id: "Plant", father: ""}
{id: "Mammals", father: "Animal"}
结果是分层节点:
Animal
|__Mammals
Plant
我遇到的问题是当我尝试在具体结构中实现接口时,这种情况下为"Category"
。
type Category struct{
children []Category
father Category
}
func (c Category) SetFather(node *Node) {
v, ok = node.(*Category)
c.father = v
}
请注意,在Category
我想与Category
父亲和孩子一起工作,而不是与接口Node
。
我无法进行转换,我得到:
invalid type assertion: nodo.(*Category) (non-interface type *Node on left)
有什么想法吗?
您的参数是node *Node
,它的类型为*Node
。 Node
是一种接口类型,但*Node
不是:它是一个指向接口的指针。
不要使用指向接口的指针,它很少需要。 而是将其更改为node Node
。 还将所有其他*Node
指针更改为Node
。
此外,如果Category.SetFather()
方法打算更改标识为接收器的Category
值,则它必须是一个指针,否则您最终只会更改在SetFather()
返回后将被丢弃的副本。 所以使用像c *Category
这样的接收器。
更进一步,如果node
参数包含包装在接口中的*Category
,则不能直接将其分配给Category.father
因为它是非指针类型Category
。 你需要一个指针间接,例如c.father = *v
; 或将father
字段的类型更改为指针: father *Category
。
更正后的SetFather()
方法可能如下所示:
func (c *Category) SetFather(node Node) {
if v, ok := node.(*Category); ok {
c.father = *v
}
}
这应该有效:
(*nodo).(Category)
先取消引用,然后断言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.