卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34135本站已运行391

如何理解golang中的结构体切片

如何理解golang中的结构体切片

问题内容

我是 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
卓越飞翔博客
上一篇: Go:类型断言 - 规范中是否有错误?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏