繁体   English   中英

带指针的 Golang 类型断言

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM