Golang - 在初始化方法中返回指针和值之间的区别

时间:2016-11-13 18:09:44

标签: pointers go

考虑以下结构:

type Queue struct {
  Elements []int
}

之间会有什么不同:

func NewQueue() Queue {
  queue := Queue{}
  return queue
}

func NewQueue() *Queue {
  queue := &Queue{}
  return queue
}

对我而言似乎几乎相同,(实际上尝试用一些排队和出队产生相同的结果)但我仍然看到两种用法在野外,所以也许一个更好。

1 个答案:

答案 0 :(得分:2)

可以返回一个值,然后调用者调用具有指针接收器的方法。但是,如果调用者总是想要使用指针,因为对象的大或者因为方法需要在适当的位置修改它,你也可以返回一个指针。 Pointers vs. values is a common question in Go and there's an answer trying to break down when to use one or the other.

在切片支持的Queue类型的特定情况下,复制为值非常小且快,如果您希望能够复制它并具有每个人都看到相同的数据,无论访问哪个副本,你都需要使用指针,因为切片实际上是一个开始指针,长度和容量的一个小结构,当你重新组合或增长它们时会发生变化。如果这是一个惊喜,the mechanics of appendslice usage and internals上的Go博客帖子可能非常有用。

如果您的队列不是为了共享或传递,而是为了在单个函数中本地使用,您可以提供一个append样式的接口,其中操作返回一个已修改的队列,但此时您可能只是想要到use slice tricks directly

(如果您的队列意图使用并发,请认真考虑使用缓冲通道。可能不是您想象的那样,但是很多棘手的部分已经存在实施者为你找到了。)

另外 - 如果Queue 确实是添加了方法的切片,则可以将其设为type Queue []int