何时使用指针

66

我对Go语言还很陌生,而且只有很少的C/C++背景,所以自然而然地我在使用指针和不使用指针的时候遇到了困难。虽然这个问题可能被认为是开放性的,但我想知道一些关于何时返回结构体和何时返回指针的指导方针,(同样地,何时接受结构体/指针作为参数)。

从我的猜测来看,以下陈述是正确的:

  1. 结构体通过值传递进函数。也就是说,在将其传递到函数中时会创建一个结构体的副本。
  2. 如果我想通过引用传递结构体,则应在函数定义中使用指针参数,并在调用函数时使用取地址操作符。
  3. 我之所以想要通过引用传递结构体,是因为要么我传递的结构体很大,通过值传递会对内存产生负担(不太可能),要么我想对我传入的副本进行更改(更有可能)。
  4. 作为3.的必然结果,除非有以上传递引用的理由,否则应该通过值传递。

我的假设是正确的吗?还是我在指针方面存在误解?


3
基本上就是这样了——我不确定你是否想问的超出了是或否的问题。关于#2,请记住,Go中的所有内容都是按值传递的,在这种情况下,您将通过值传递指针。 - JimB
1
这本质上是一个是/否问题,但如果是否,则我会想知道出了什么问题。感谢您的意见。对于第二个问题,可以这样说,指针按值传递,但我们使用该指针来修改它所指向的对象,但如果我们传入一个结构体(而不是指向该结构体的指针),那么我们只能修改副本。 - Jim Pedid
是的,对于第二点,您的评论是正确的。指针按值传递,但允许您访问其指向的内容。如果您的接收器是一个结构体而不是结构体指针,则该方法将在副本上运行。 - evanmcdonnal
1个回答

32

您的假设是正确的。关于第三点,Go 是一种并发语言,通过引用在 goroutine 中传递结构体可以使它们都读取相同的结构体,这是安全的,但也会使它们修改相同的结构体,这是危险的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接