理解 Go 中指针的值修改
在 Go 中,指针允许间接访问和修改值。然而,在将指针传递给函数时,了解指针的工作原理至关重要。
将指针传递给函数时,会出现两种情况:值修改与指针重新分配。
场景 1 :值修改
考虑以下代码:
<code class="go">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} }</code>
这里,函数 f 接收一个指向 Test 结构的指针。在 f 内部,解引用的指针 (*p) 被分配了一个新的 Test 结构,其值为 4。这有效地修改了 main 函数中的原始 i 结构,输出为 4。
场景2:指针重新赋值
现在,让我们稍微改变一下代码:
<code class="go">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} }</code>
在这种情况下,函数不会修改指向的值,而是将 p 指针重新分配给新的值测试struct的值为4。由于p是f内的局部变量,所以这个改变不会影响main函数中原来的i结构体,输出仍为2。
解决方案:修改Pointed Value
要修改指向的值,我们必须取消引用指针并直接访问结构体成员:
<code class="go">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 }</code>
通过使用 p.Value,我们修改原始结构体的 Value 字段,结果输出为 4。
以上是指针如何影响 Go 函数中的值修改?的详细内容。更多信息请关注PHP中文网其他相关文章!