为了账号安全,请及时绑定邮箱和手机立即绑定

我应该将指针作为参数传递吗

我应该将指针作为参数传递吗

Go
拉丁的传说 2021-12-07 15:21:18
我第一次使用指针,我有一个可能很简单的问题。我有两个函数main和other. 如果我想在main函数中提供一个变量,我other应该将它作为参数传递还是打败指针对象?选项1func main() {    myVar := "hello world"       other(&myVar)}func other(s *string) {    println(s)}选项 2func main() {    myVar := "hello world"    other()   }func other() {    println(*myVar) //Is myVar even accessible here?}
查看完整描述

1 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

不知道为什么你被否决了......第二个选项将无法编译,因为在另一个函数 myVar 中不存在。每个变量都有一个作用域。该变量只能在其作用域内访问。


(如果您想了解有关 go 中不同范围的更多信息,我推荐以下链接https://www.golang-book.com/books/web/01-02 - 向下滚动到范围。它通过漂亮的可视化进行了很好的解释.)


为了让事情更清楚一些,我添加了一些例子:


选项 1 - 传递指针值


这就是你所拥有的。但请确保取消引用您的指针以取回实际字符串。您的版本正在打印指针本身(内存地址)。查看我的更改(*s 而不仅仅是 s)!


func main() {

    myVar := "hello world"

    other(&myVar)

}


func other(s *string) {

    println(*s)

}

选项 2 - 传递变量值


这可能就是您对选项 2 的意思。


package main


func main() {

    myVar := "hello world"

    other(myVar)

}


func other(myVar string) {

    println(myVar) 

}

选项 3 - 使 myVar 成为全球性的


也许这就是您在第二个选项中想要做的。myVar 在这里是全局的(或者在 golang 行话中,myVar 有一个包级作用域),因此可以在另一个函数内部访问。


var myVar = "hello world"


func main() {

    other()

}


func other() {

    println(myVar)

}

至于您的问题,您是否应该传递值或指向变量的指针:


通常,如果您的函数需要能够编辑该值,则您可以传递指针。此外,当变量本身非常大并且传递值会花费时间/资源时,您可以传递更有效的指针。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信