英文:
When to use pointers
问题
我是你的中文翻译助手,以下是翻译好的内容:
我对Go语言还很陌生,对C/C++也只有一些基础知识,所以我对何时使用指针和何时不使用指针感到困惑。虽然这个问题可能没有确定的答案,但我想知道一些关于何时返回结构体和何时返回指针的指导原则(同样地,何时接受结构体/指针作为参数)。
根据我的猜测,以下观点是正确的:
- 结构体通过值传递给函数。也就是说,在将结构体传递给函数时会创建一个副本。
- 如果我想通过引用传递结构体,那么在函数定义中我应该使用指针参数,并在调用函数时使用取地址运算符。
- 我想通过引用传递结构体的原因是,要么我传递的结构体很大,在内存中传递副本会占用很多资源(不太可能),要么我想对传入的副本进行修改(更有可能)。
- 作为对第3点的推论,除非有以上原因需要通过引用传递,否则应该通过值传递。
我的假设正确吗?还是我对指针的理解有误?
英文:
I'm new to the Go Language, and have only minimal background in C/C++, so naturally I'm struggling with the idea of when to use pointers and when not to use pointers. Although this question might be considered open-ended, I'm wondering what some guidelines on when to return structs and when to return pointers, (and equivalently when to accept structs / pointers as arguments).
From what I can guess, the following statements hold true:
- structs are passed into functions by value. That is, a copy of a structure is made when passing it into a function.
- if I want to pass a structure by reference, then I would instead use a pointer argument in the function definition, and use the addressof operator when calling the function.
- The reason why I would want to pass in a structure by reference is because either the structure I'm passing in is large, and it would be taxing on memory to pass it by value (unlikely) or if I want to make changes to the copy that I'm passing in (more likely).
- As a corollary to 3.), I should pass by value unless I have one of the reasons above to pass by reference.
Are my assumptions correct? Or am I missing the mark on pointers?
答案1
得分: 31
你的假设是正确的。关于第三点,Go是一种并发语言,通过引用传递在goroutines中使它们都读取相同的结构是安全的,但也使它们修改相同的结构变得危险。
英文:
Your assumptions are correct. About #3, Go is concurrent language and passing by reference in goroutines make them all read same structure which is safe, but also make them modify same structure which is dangerous.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论