调用结构属性方法时 Golang 结构指针引用丢失

我正在尝试使用 astruct来管理树上的访问节点。每当我访问父节点的子节点的方法时,后续调用的父引用就会丢失(即parent.child.method(child) -> [parent becomes nil]-> parent(the previous child).child ... etc)。


这是我文件中的错误片段。


type Node struct {

    Left *Node

    Right *Node

    value int

}


func (parent *Node) determineSide(child *Node) (Node, Node) {


    if child.Value < parent.Value {

        if parent.hasLeftNode() {

            return parent.Left.determineSide(child)

        }

        return parent.addLeftNode(child)


    } else if child.Value > parent.Value {

        if parent.hasRightNode() {

           return parent.Right.determineSide(child)

        }

        return parent.addRightNode(child)

    }

    return *child, *parent

 }

我试图通过尝试找到一种方法来通知新引用应该是的方法来解决这个问题parent.Left。*parent.Leftusing和之类的东西&parent.Left似乎不正确。


一个解决方案可能是将此代码移出,struct并让另一个函数处理结果以进行快速修复,但我想了解为什么这不是开箱即用的。这里的思维过程受到使用的影响this.child.determineSide(child)。


完整代码在这里



慕少森
浏览 196回答 2
2回答

达令说

好吧,我终于知道你到底在问什么了。New() 方法返回一个值,而不是指针,这意味着您看不到调用者以后的更改。调用者得到的只是 Node.js 的一个值副本。所以你打印的父级将永远是{Left:<nil> Right:<nil> Value:2}。所以和addLeftNode()一样addRightNode()。只需使用指针,而不是价值来实现您的目标。我认为这只是Visit()问题所在的方法。当您在访问左孩子后立即返回时,它永远不会访问右孩子。左右孩子不互斥,所以第二个 if 子句不应该使用else if,应该是if。访问顺序也有问题。前:// Visit will automatically walk through the Child Nodes of the accessed Parent Node.func (parent *Node) Visit() (Node, int) {    fmt.Println("Node value:", parent.Value)    if parent.hasLeftNode() {        return parent.Left.Visit()    } else if parent.hasRightNode() {        return parent.Right.Visit()    }    return *parent, parent.Value}修改的:// Visit will automatically walk through the Child Nodes of the accessed Parent Node.func (parent *Node) Visit() (Node, int) {    if parent.hasLeftNode() {        parent.Left.Visit()    }    fmt.Println("Node value:", parent.Value)    if parent.hasRightNode() {        parent.Right.Visit()    }    return *parent, parent.Value}另外,对我来说,Visit()不应该返回任何值。

慕慕森

前:// Visit will automatically walk through the Child Nodes of the accessed Parent Node.func (parent *Node) Visit() (Node, int) {&nbsp; &nbsp; fmt.Println("Node value:", parent.Value)&nbsp; &nbsp; if parent.hasLeftNode() {&nbsp; &nbsp; &nbsp; &nbsp; return parent.Left.Visit()&nbsp; &nbsp; } else if parent.hasRightNode() {&nbsp; &nbsp; &nbsp; &nbsp; return parent.Right.Visit()&nbsp; &nbsp; }&nbsp; &nbsp; return *parent, parent.Value}修改的:// Visit will automatically walk through the Child Nodes of the accessed Parent Node.func (parent *Node) Visit() (Node, int) {&nbsp; &nbsp; if parent.hasLeftNode() {&nbsp; &nbsp; &nbsp; &nbsp; parent.Left.Visit()&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println("Node value:", parent.Value)&nbsp; &nbsp; if parent.hasRightNode() {&nbsp; &nbsp; &nbsp; &nbsp; parent.Right.Visit()&nbsp; &nbsp; }&nbsp; &nbsp; return *parent, parent.Value}另外,对我来说,Visit()不应该返回任何值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go