Go 中的指標修改,了解差異
在Go 中,當將指標傳遞給函數時,我們通常會修改值該指針所指向的。通常,這可以透過取消引用來實現,如以下程式碼所示:
<code class="go">type Test struct { Value int } func main() { i := Test{2} p := &i f(p) println(i.Value) // Output: 4 } func f(p *Test) { *p = Test{4} }</code>
但是,在某些情況下,傳遞的指標指向的結構體的值可能保持不變,即使在修改後也是如此函數內。為了理解為什麼會發生這種情況,讓我們檢查一下修改後的程式碼片段:
<code class="go">type Test struct { Value int } func main() { i := Test{2} p := &i f(p) println(i.Value) // Output: 2 } func f(p *Test) { // Attempt to modify the pointer value p = &Test{4} }</code>
此程式碼片段嘗試修改指標值 p,但無法變更最初指向的結構體的值。原因是 f() 函數內的賦值 p = &Test{4} 僅修改局部變數 p 的值。
在 f() 函數內,p 被視為局部變量,並且為其分配新值不會影響從 main() 函數傳遞的指標的值。因此,p 指向的結構體保持不變,反映在列印時 i.Value 的值不變。
相反,以下程式碼示範了修改結構體值的正確方法:
<code class="go">type Test struct { Value int } func main() { i := Test{2} p := &i f(p) println(i.Value) // Output: 4 } func f(p *Test) { p.Value = 4 }</code>
在這段程式碼中,p.Value = 4 直接修改了p指向的結構體的Value字段。這會導致結構體值的所需修改,這反映在列印時 i.Value 的更新值中。
值得注意的是,為指標本身分配一個新值(如 p = &Test{ 4})有不同的效果。此賦值將建立一個指向新結構的新指針,但不會影響從 main() 函數傳遞的原始指針所指向的結構的值。
以上是為什麼Go函數中修改指標有時不影響原值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!