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

How to understand structure slicing in golang

WBOY
Release: 2024-02-06 08:35:03
forward
1247 people have browsed it

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
Copy after login

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
Copy after login

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
Copy after login

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
Copy after login

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
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template