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
)更高效、更方便、更干净