理解 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 中的局部变量,因此此更改不会影响主函数中原来的 i 结构体,输出仍为 2.
解决方案:修改指向值
要修改指向值,我们必须取消引用指针并直接访问结构体成员:
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