Home  >  Article  >  Backend Development  >  How to understand structure slicing in golang

How to understand structure slicing in golang

WBOY
WBOYforward
2024-02-06 08:35:031229browse

How to understand structure slicing in golang

Question content

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 0x3001

Correct answer


Here'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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete