我是 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中文網其他相關文章!