我是 golang 新手,正在尝试理解指针。
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
queue:=[]TreeNode{TreeNode{}}
node:=TreeNode{Val: 1}
pre:=queue[len(queue)-1]
pre.Left = &node
但是我发现queue[0].Left仍然是nil
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
queue:=[]*TreeNode{&TreeNode{}}
node:=&TreeNode{Val: 1}
pre := queue[len(queue)-1]
pre.Left = node
这次queue[0].Left不为nil
有人可以帮我理解为什么会这样吗?
如果你能在记忆层面上解释一下那就太好了。
例如: 我们在 0x1001 处有一个 TreeNode 切片 那么地址中存储了什么 以及切片如何链接到 A TreeNode,例如,地址 0x3001正确答案
以下是第一段代码中发生的情况:
queue:=[]TreeNode{TreeNode{}}
node:=TreeNode{Val: 1}
// Copy last element of slice to local variable pre
pre:=queue[len(queue)-1]
// Assign field in local variable pre. The slice element is
// not modified.
pre.Left = &node
这是第二个片段:
queue:=[]*TreeNode{&TreeNode{}}
node:=&TreeNode{Val: 1}
// Copy last element of queue to local variable pre.
// pre and the last element of queue have the same pointer
// value (it was just copied) and point at the same node.
pre := queue[len(queue)-1]
// Set the left field in the node that pre points to. queue[0]
// also points at this node.
// This code is syntactic sugar for (*pre).Left = node.
pre.Left = node
要修复第一个示例,请修改切片元素而不是局部变量 pre。一种方法是使用指向切片元素的指针。
queue:=[]TreeNode{TreeNode{}}
node:=TreeNode{Val: 1}
// Variable pre is pointer to last element in slice.
pre:= &queue[len(queue)-1]
// Set the left field in the node that pre points to. This
// is the same value as queue[0].
pre.Left = &node