”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 指针如何影响 Go 函数中的值修改?

指针如何影响 Go 函数中的值修改?

发布于2024-11-07
浏览:319

How do pointers affect value modification in Go functions?

理解 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