I am new to golang and trying to understand pointers.
type TreeNode struct { Val int Left *TreeNode Right *TreeNode } queue:=[]TreeNode{TreeNode{}} node:=TreeNode{Val: 1} pre:=queue[len(queue)-1] pre.Left = &node
But I found that queue[0].Left is still 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
This time queue[0].Left is not nil
Can someone help me understand why this is happening?
It would be great if you could explain it on a memory level.
For example: We have a TreeNode slice at 0x1001 So what is stored in the address? And how the slice is linked to A TreeNode, for example, address 0x3001Here's what happens in the first piece of code:
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
This is the second clip:
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
To fix the first example, modify the slice element instead of the local variable pre. One way is to use pointers to slice elements.
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
The above is the detailed content of How to understand structure slicing in golang. For more information, please follow other related articles on the PHP Chinese website!