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

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

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

type Node struct {
    items  []int
    childs []*Node
    parent *Node
}

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

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

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


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

w46czmvw

w46czmvw1#

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

A
|
C

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

A
|
B
|
C


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

// initially, cur = C

// set cur = A:
cur = cur.parent

// insert B between A and C:
cur._insertNode(upTo, rn)

// cur is still A

// split A:
upTo, rn = cur._splitNode()


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

// initially, cur = C

// insert B between A and C:
cur.parent._insertNode(upTo, rn)

// cur.parent is now B

// split B:
upTo, rn = cur.parent._splitNode()

// set cur = B:
cur = cur.parent


看到了吗?

相关问题