考虑以下结构:
type Queue struct {
Elements []int
}
之间会有什么不同:
func NewQueue() Queue {
queue := Queue{}
return queue
}
和
func NewQueue() *Queue {
queue := &Queue{}
return queue
}
对我而言似乎几乎相同,(实际上尝试用一些排队和出队产生相同的结果)但我仍然看到两种用法在野外,所以也许一个更好。
答案 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 append
和slice usage and internals上的Go博客帖子可能非常有用。
如果您的队列不是为了共享或传递,而是为了在单个函数中本地使用,您可以提供一个append
样式的接口,其中操作返回一个已修改的队列,但此时您可能只是想要到use slice tricks directly。
(如果您的队列意图使用并发,请认真考虑使用缓冲通道。可能不是您想象的那样,但是很多棘手的部分已经存在实施者为你找到了。)
另外 - 如果Queue
确实是添加了方法的切片,则可以将其设为type Queue []int
。