首页 >后端开发 >Golang >如何理解golang中的结构体切片

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

WBOY
WBOY转载
2024-02-06 08:35:031242浏览

如何理解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

以上是如何理解golang中的结构体切片的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除