首頁 > 後端開發 > Golang > 如何理解golang中的結構體切片

如何理解golang中的結構體切片

WBOY
發布: 2024-02-06 08:35:03
轉載
1262 人瀏覽過

如何理解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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板