我一直在一个界面中用作层次树。这个想法是大声地调用
我只需要此接口的三种不同实现,也许对每个结构进行整个操作会更方便,但是我是Go语言的新手,因此决定使用此示例来了解接口。
我来到一个看起来像这样的界面:
1 2 3 4 5 6 7 8 | type Node interface{ Equals(nodo *Node) bool AddChild(child *Node) SetFather(father *Node) Children() []Node Father() *Node } |
所以这个想法叫做
1 | func Populate(plainNodes []Node, HierarchichalNodes *[]Node) {} |
普通节点将是定义其父亲ID的项目:
1 2 3 | {id:"Animal", father:""} {id:"Plant", father:""} {id:"Mammals", father:"Animal"} |
分层节点将是结果:
1 2 3 4 | Animal |__Mammals Plant |
我遇到的问题是当我尝试在具体的结构(本例为
1 2 3 4 5 6 7 8 9 | type Category struct{ children []Category father Category } func (c Category) SetFather(node *Node) { v, ok = node.(*Category) c.father = v } |
请注意,在
我无法进行转换,我得到:
1 | invalid type assertion: nodo.(*Category) (non-interface type *Node on left) |
有任何想法吗?
-
您应该将接口传递为指针。 指向
*Category 的指针是Node ,而不是指向Node 的指针。
您的参数为
不要使用指向接口的指针,这很少需要。 而是将其更改为
同样,如果
更进一步,如果
已更正的
1 2 3 4 5 | func (c *Category) SetFather(node Node) { if v, ok := node.(*Category); ok { c.father = *v } } |
- 如何使SetFather成为(指针?)接口的方法?
-
@Marcos当您在
Node 下列出SetFather() 方法时,它将是Node 接口的方法。 声明func (c *Category) SetFather(node Node) 方法时,此SetFather() 成为类型为*Category 的方法(接收方)。 因此,如果对Node 的所有其他方法执行相同操作,则类型*Categroy 将实现Node ,因此可以将类型为*Category 的值分配给类型为Node 的变量。 - 指向接口的指针经常使用。 没有它们,Go的http软件包将无法工作。
- 只是不要在函数头中写节点* Node(但是如果要使用指针,则将指针保留在其他位置)。
这应该工作:
1 | (*nodo).(Category) |
首先解除引用,然后进行比较。