Go语言 指针调用方法陷阱?

q5iwbnjs  于 2023-11-14  发布在  Go
关注(0)|答案(1)|浏览(110)

我正在写一个关于2-3-4树的实现。节点结构如下

  1. type Node struct {
  2. items []int
  3. childs []*Node
  4. parent *Node
  5. }

字符串
我对下面的代码感到困惑。在我看来,这两部分做的是同样的事情。然而,其中一个是错误的。

  • 权代码
  1. cur = cur.parent
  2. cur._insertNode(upTo, rn)
  3. upTo, rn = cur._splitNode()

  • 错误代码
  1. cur.parent._insertNode(upTo, rn)
  2. upTo, rn = cur.parent._splitNode()
  3. cur = cur.parent


有谁能告诉我有什么区别吗?
我期待的是关于这个问题的解释。这是一个Go指针方法的陷阱?还是编译器的错误?

w46czmvw

w46czmvw1#

假设 Ccur最初指向的节点,AC 最初的父节点,假设对_insertNode的调用在 AC 之间插入了一个新节点 B;因此,我们从这里开始:

  1. A
  2. |
  3. C

字符串
(plus其他节点,与我的观点无关):

  1. A
  2. |
  3. B
  4. |
  5. C


(plus其他节点,仍然与我的观点无关)。
需要注意的是,在调用_insertNode之前,C 的父代是 A;在调用_insertNode之后,C 的父代是 B
考虑到这一点,这里是你的“正确的代码”,加上解释它在做什么的注解:

  1. // initially, cur = C
  2. // set cur = A:
  3. cur = cur.parent
  4. // insert B between A and C:
  5. cur._insertNode(upTo, rn)
  6. // cur is still A
  7. // split A:
  8. upTo, rn = cur._splitNode()


这里是你的“错误代码”,加上解释它在做什么的注解:

  1. // initially, cur = C
  2. // insert B between A and C:
  3. cur.parent._insertNode(upTo, rn)
  4. // cur.parent is now B
  5. // split B:
  6. upTo, rn = cur.parent._splitNode()
  7. // set cur = B:
  8. cur = cur.parent


看到了吗?

展开查看全部

相关问题