瞭解 Go 中指標的值修改
在 Go 中,指標允許間接存取和修改值。然而,在將指標傳遞給函數時,了解指標的工作原理至關重要。
將指標傳遞給函數時,會出現兩種情況:值修改與指標重新指派。
場景 1 : 值修改
考慮這段程式碼:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
*p = Test{4}
}
這裡,函數 f 接收一個指向 Test 結構的指標。在 f 內部,解引用的指標 (*p) 被指派了一個新的 Test 結構,其值為 4。這有效地修改了 main 函數中的原始 i 結構,輸出為 4。
場景2:指標重新賦值
現在,我們稍微改變一下程式碼:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 2
}
func f(p *Test) {
// ?
p = &Test{4}
}
在這種情況下,函數不會修改指向的值,而是將 p 指標重新指派給值為 4 的新 Test 結構。由於p 是f 中的局部變量,因此此更改不會影響main函數中原來的i結構體,輸出仍為2.
解決方案:修改Pointed Value
修改指向的值,我們必須取消引用指標並直接存取結構體成員:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
p.Value = 4
}
透過使用p.Value,我們修改了原始結構體的Value字段,導致輸出為4。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3