为了账号安全,请及时绑定邮箱和手机立即绑定

通过将指针传递给 Go 中的函数来获取不同的值

通过将指针传递给 Go 中的函数来获取不同的值

Go
萧十郎 2021-11-29 19:43:45
假设我想传递一个指向函数的指针并通过这样做更改该指针指向的结构的值。我通常会通过取消引用指针来做到这一点: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}}我的问题是,为什么这段代码不会改变值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}}而这个: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}
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

因为这一行:


p = &Test{4}

只需为p变量分配一个新的指针值。在f()函数内部,p只是一个局部变量。通过为 分配任何新值p,您只是在更改局部变量的值,而不是指向的值。


在p局部变量f()无关,与p在本地变量main()。如果你改变p的f(),它不会改变p的main()(这也不会改变尖结构值)。


在你的第二个例子中:


p.Value = 4

它是以下的简写:


(*p).Value = 4

这会改变指向值,因此您将在f()返回时观察到变化。


笔记:


顺便提一下,如果在您的main()函数中,您要将p(main()作为指针的局部变量)的地址传递给 function f(),您可以修改存储在 main 中的地址p:


func f(p **Test) {

    *p = &Test{4}

}

从main(),称之为:


var i Test = Test{2}

var p *Test = &i

f(&p)

println(i.Value) // 2 - Note that 'i' won't change!

println(p.Value) // 4 - Only the address in 'p' to the new struct value created in f()

但显然传递单个指针*Test并修改指向的值 ( p.Value = 4) 更有效,更方便,更干净。


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信