首頁  >  文章  >  後端開發  >  為什麼Go函數中修改指標有時不影響原值?

為什麼Go函數中修改指標有時不影響原值?

Susan Sarandon
Susan Sarandon原創
2024-10-27 11:30:30747瀏覽

 Why Does Pointer Modification in Go Functions Sometimes Not Affect the Original Value?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn