Golang 中結構體指標方法中的指標可以重新賦值嗎?
Golang 中,結構體指標方法允許對接收者結構體進行修改無需明確傳遞指標。然而,許多開發人員在嘗試在結構體指標方法中重新分配主指標時遇到困難。
一個特定的場景涉及 AVL 樹,其中 tree.rotateLeftToRoot() 方法不會更新範圍之外的樹指標的函數。這就引出了能否在函數作用域外重新分配結構指針方法中的指針,或者是否不鼓勵這樣做的問題?
Understanding Pointers and Values
Golang中的指標代表記憶體位址,而其他資料型別(例如整數)代表它們自己的值。當修改 *T 類型(其中 T 是任何資料類型)的變數時,需要傳遞指向該變數的指標 (**T)。這允許修改指向的物件(記憶體位址處的值),而不僅僅是指標的副本。
接收器類型的限制
在下列情況下結構指標方法,接收者不能是指標的指標(**T)。這意味著結構體指標方法中的指標不能直接重新分配。
重新分配的解決方案
有兩種可能的解決方案:
範例實作
非指標函數:
func rotateLeftToRoot(ptree **AvlTree) { tree := *ptree if tree == nil { return } prevLeft := tree.left if prevLeft != nil { tree.left = prevLeft.right prevLeft.right = tree tree = prevLeft } *ptree = tree }
傳回指標的方法:
func (tree *AvlTree) rotateLeftToRoot() *AvlTree { if tree == nil { return nil } prevLeft := tree.left if prevLeft != nil { tree.left = prevLeft.right prevLeft.right = tree tree = prevLeft } return tree }
無論哪種情況,都可以達到預期的效果。然而,值得注意的是,從方法傳回指標是常見的做法,特別是在修改底層資料結構時。
以上是可以在 Golang 結構體指標方法中重新分配指標嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!