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

为什么我的 Go 指针接收器不会导致更新?

为什么我的 Go 指针接收器不会导致更新?

Go
明月笑刀无情 2021-06-28 21:02:41
我想要一些关于 Go 指针接收器如何工作的帮助。我有一个二叉搜索树的包含示例,希望可以帮助我解释。package mainimport "fmt"type Node struct {  key         int  left, right *Node}func NewNode(key int) *Node {  return &Node{key, nil, nil}}type BST struct {  root *Node}func NewBinarySearchTree() *BST {  return &BST{nil}}func (t *BST) Insert(key int) {  if t.root == nil {    t.root = NewNode(key)    return  }  var node = t.root  for {    if key < node.key {      if node.left == nil {        node.left = NewNode(key)        return      } else {        node = node.left      }    } else {      if node.right == nil {        node.right = NewNode(key)        return      } else {        node = node.right      }    }  }}func inorder(node *Node) {  if node == nil {    return  }  inorder(node.left)  fmt.Print(node.key, " ")  inorder(node.right)}func main() {  tree := NewBinarySearchTree()  tree.Insert(3)  tree.Insert(1)  tree.Insert(2)  tree.Insert(4)  inorder(tree.root) // 1 2 3 4}然而,在我写完之后,我想我可以将我的插入函数简化如下:func (t *BST) Insert2(key int) {  var node *Node  node = t.root  for node != nil {    if key < node.key {      node = node.left    } else {      node = node.right    }  }  node = NewNode(key)}但是,这样做树永远不会更新。我的想法是...在第一次插入时,根节点将为 nil。所以引用 t.root 的局部变量节点也将为 nil因此将跳过 for 循环。node = NewNode(key) 将具有相同的效果 t.root = NewNode(key)我的 Insert2 方法哪里出错了?有没有办法可以调整?
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您似乎混淆了指针的使用。


当你这样做时node = t.root,你只是node指向任何t.root指向的东西。


稍后,当您这样做时node = NewNode(key),您会node指向一个新创建的项目,这不是您想要的;您想改为t.root指向该新项目。


由于您打算修改类型为*Node( root,left和right) 的变量,因此我们需要一个指向它们的指针,因此类型为 的变量**Node具有更高的间接级别。


您可以通过启动node点的地址t.root,node := &t.root,然后你继续你的循环。


您可以尝试以下操作:


func (t *BST) Insert3(key int) {

    node := &t.root

    for *node != nil {

        if key < (*node).key {

            node = &(*node).left

        } else {

            node = &(*node).right

        }

    }

    *node = NewNode(key)

}

注意我们使用间接运算符*来访问引用的数据,在检查循环上的地址时,还有键。


在函数的最后,*node = NewNode(key)做你原本打算做的事情;您将新创建的项目分配给根指针、左指针或右指针。


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

添加回答

举报

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