猿问

通过将指针传递给 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}

}

我的问题是,为什么这段代码不会改变值


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

}


萧十郎
浏览 148回答 1
1回答

慕妹3242003

因为这一行: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 = &if(&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) 更有效,更方便,更干净。
随时随地看视频慕课网APP

相关分类

Go
我要回答