登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-28 16:09:40 393浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《通过将指针传递给 Go 中的函数来获取不同的值》,本文主要会讲到golang等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

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

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,您只是更改了局部变量的值,而 不是 指向的值。

pin的局部变量与 in 的局部变量f()无关。如果您更改in ,它不会更改(也不会更改指向的结构值)。p``main()``p``f()``p``main()

在您的第二个示例中:

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()

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

好了,本文到此结束,带大家了解了《通过将指针传递给 Go 中的函数来获取不同的值》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>