Go中指標的修改,理解差異
在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}
}
然而,在某些情況下,傳遞的指標所指向的結構體的值可能保持不變,即使在函數內對其進行修改後也是如此。為了理解為什麼會發生這種情況,讓我們檢查修改後的程式碼片段:
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}
}
此程式碼片段嘗試修改指標值p,但未能變更原先指向的結構體的值。原因是 f() 函數中的賦值 p = &Test{4} 僅修改了局部變數 p 的值。
在 f() 函數內部,p 被視為局部變量,並且為其分配新值不會影響從 main() 函數傳遞的指標的值。因此,p 指向的結構體保持不變,反映在列印時 i.Value 的值不變。
相反,以下程式碼示範了修改結構體值的正確方法:
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
}
在這段程式碼中,p.Value = 4直接修改了p指向的結構體的Value欄位。這會導致結構體值進行所需的修改,這反映在列印時 i.Value 的更新值中。
值得注意的是,為指標本身分配一個新值(如 p = &Test{ 4})有不同的效果。此賦值將建立一個指向新結構的新指針,但不會影響從 main() 函數傳遞的原始指針所指向的結構的值。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3