英文:
Should I pass pointers as parameters
问题
我正在使用指针进行工作,我有一个可能很简单的问题。
我有两个函数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) //这里能访问到myVar吗?
}
英文:
I'm working with pointers for the first time and I have what is probably a simple question.
I have two functions main
and other
. If I have a variable in the main
function that I would like to make available in the other
function should I pass it as a parameter or is that defeating the object of pointers?
OPTION 1
func main() {
myVar := "hello world"
other(&myVar)
}
func other(s *string) {
println(s)
}
OPTION 2
func main() {
myVar := "hello world"
other()
}
func other() {
println(*myVar) //Is myVar even accessible here?
}
答案1
得分: 6
不确定为什么你被投票下降了...第二个选项无法编译,因为在另一个函数内部,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 - 传递变量值
这可能是你在第二个选项中想要的。
package main
func main() {
myVar := "hello world"
other(myVar)
}
func other(myVar string) {
println(myVar)
}
选项3 - 将myVar设为全局变量
也许这是你在第二个选项中想要做的。在这里,myVar是全局的(或者按照Go语言的说法,myVar具有包级别的作用域),因此可以在other函数内部访问。
var myVar = "hello world"
func main() {
other()
}
func other() {
println(myVar)
}
至于你是否应该传递值还是变量的指针:
通常情况下,如果你的函数需要能够编辑该值,你会传递指针。此外,当变量本身非常大,并且传递值会消耗时间/资源时,你可以传递指针,这样更有效率。
英文:
Not sure why you've got downvoted... The second option will not compile because inside the other function myVar is not present. Every variable has a scope. The variable is only accessible inside it's scope.
(If you like to learn more about the diffrent scopes in go I recommend the following link https://www.golang-book.com/books/web/01-02 - scroll down to scope. It's well explained with a nice visualization.)
To make things a bit clearer, I add some examples:
OPTION 1 - pass the pointer value
This is what you had. But make sure to dereference your pointer to get back the actual string. Your version was printing the pointer itself (mem-address). See my change (*s instead of just s)!
func main() {
myVar := "hello world"
other(&myVar)
}
func other(s *string) {
println(*s)
}
OPTION 2 - pass the variable value
This is probably what you meant with your option 2.
package main
func main() {
myVar := "hello world"
other(myVar)
}
func other(myVar string) {
println(myVar)
}
OPTION 3 - make myVar global
Maybe this is what you wanted to do in your second option. myVar is global here (or as in golang lingo, myVar has a package-level scope), therefore accessible inside the other function.
var myVar = "hello world"
func main() {
other()
}
func other() {
println(myVar)
}
As to your question wether you should pass the value or a pointer to the variable:
In general you pass pointers, if your function needs to be able to edit the value. Also when the variable itself is really big and it would cost time / ressources to pass the value you can pass the pointer which is more efficent.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论