为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕少森 2023-05-22 17:16:35
我正在尝试使用 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)。完整代码在这里。
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

好吧,我终于知道你到底在问什么了。

New() 方法返回一个值,而不是指针,这意味着您看不到调用者以后的更改。调用者得到的只是 Node.js 的一个值副本。所以你打印的父级将永远是{Left:<nil> Right:<nil> Value:2}

所以和addLeftNode()一样addRightNode()

只需使用指针,而不是价值来实现您的目标。


我认为这只是Visit()问题所在的方法。

  1. 当您在访问左孩子后立即返回时,它永远不会访问右孩子。

  2. 左右孩子不互斥,所以第二个 if 子句不应该使用else if,应该是if

  3. 访问顺序也有问题。

前:


// 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()不应该返回任何值。


查看完整回答
反对 回复 2023-05-22
?
慕慕森

TA贡献1856条经验 获得超17个赞

前:


// 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()不应该返回任何值。


查看完整回答
反对 回复 2023-05-22
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信