我第一次使用指针,我有一个简单的问题。
我有两个函数main
和other
。如果我在main
函数中有一个我想在other
函数中使用的变量,我应该将其作为参数传递还是击败指针对象?
选项1
func main() {
myVar := "hello world"
other(&myVar)
}
func other(s *string) {
println(s)
}
选项2
func main() {
myVar := "hello world"
other()
}
func other() {
println(*myVar) //Is myVar even accessible here?
}
答案 0 :(得分:6)
不确定你为什么会被投票...第二个选项无法编译,因为在其他函数内部myVar不存在。每个变量都有一个范围。该变量只能在其范围内访问。
(如果您想了解有关不同范围的更多信息,请参阅以下链接https://www.golang-book.com/books/web/01-02 - 向下滚动到范围。通过良好的可视化对其进行了很好的解释。)
为了使事情更清楚,我添加一些例子:
选项1 - 传递指针值
这就是你所拥有的。但请确保取消引用指针以获取实际字符串。您的版本是打印指针本身(mem-address)。看到我的变化(* 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 lingo中,myVar有一个包 -level范围),因此可以在其他函数中访问。
var myVar = "hello world"
func main() {
other()
}
func other() {
println(myVar)
}
关于你的问题,你应该传递值或指向变量的指针:
通常,如果您的函数需要能够编辑值,则传递指针。此外,当变量本身非常大并且需要花费时间/资源来传递值时,您可以传递更有效的指针。