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

Pointers 通过向Go中的函数传递指针来获取不同的值,pointers,struct,go,Pointers,Struct,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

假设我想传递一个指向函数的指针,并通过这样做来更改该指针指向的结构的值。我通常会通过取消引用指针来执行此操作:

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
}
因为这一行:

p = &Test{4}
只需为
p
变量指定一个新指针值。在
f()
函数中,
p
只是一个局部变量。通过将任何新值赋给
p
,您只需更改局部变量的值,而不是指定值

f()
中的
p
局部变量与
main()
中的
p
局部变量无关。如果在
f()
中更改
p
,它将不会在
main()
中更改
p
(并且也不会更改指向的结构值)

在第二个示例中:

p.Value = 4
它是以下内容的简写:

(*p).Value = 4
这会更改指向的值,因此当
f()
返回时,您将观察到更改

注意:

作为旁注,如果在
main()
函数中将
p
的地址(
main()
中的局部变量是指针)传递给函数
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()
但显然,传递单个指针
*测试
和修改指针值(
p.value=4
)更高效、更方便、更干净