gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:23:13 26 4
gpt4 key购买 nike

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

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 分配任何新值,您只是在更改局部变量的值,不是指向的值。

p f() 中的局部变量与p无关main() 中的局部变量.如果你改变 pf() , 它不会改变 pmain() (它也不会改变指向的结构值)。

在你的第二个例子中:

p.Value = 4

它是以下内容的简写:

(*p).Value = 4

这会改变pointed 值,因此您会在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()

但显然传递了一个指针*Test修改指向值 ( p.Value = 4 ) 更高效、更方便、更简洁。

关于pointers - 通过将指针传递给 Go 中的函数来获取不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com