Pointers 在初始化方法中返回指针和值之间的差异
考虑以下结构:Pointers 在初始化方法中返回指针和值之间的差异,pointers,go,Pointers,Go,考虑以下结构: type Queue struct { Elements []int } 以下两者之间的区别是什么: func NewQueue() Queue { queue := Queue{} return queue } 及 在我看来,这两种方法几乎是一样的(事实上,尝试一些排队和退队的方法会得到相同的结果),但我仍然在野外看到这两种用法,所以也许其中一种更可取 可以返回一个值,然后调用方调用具有指针接收器的方法。但是,如果调用方总是希望使用指针,因为对象很大,或者因为方
type Queue struct {
Elements []int
}
以下两者之间的区别是什么:
func NewQueue() Queue {
queue := Queue{}
return queue
}
及
在我看来,这两种方法几乎是一样的(事实上,尝试一些排队和退队的方法会得到相同的结果),但我仍然在野外看到这两种用法,所以也许其中一种更可取 可以返回一个值,然后调用方调用具有指针接收器的方法。但是,如果调用方总是希望使用指针,因为对象很大,或者因为方法需要在适当的位置修改它,那么您最好返回一个指针 在以片为背景的
队列
类型的特定情况下,作为值进行复制是非常小和快速的,但是如果您希望能够复制它并让每个人都看到相同的数据,无论访问哪个副本,您都需要使用指针,因为片实际上是一个由起始指针、长度和容量组成的小结构,当你重新切片或种植时,这些都会改变。如果这是一个惊喜,Go博客上的文章可能是有用的阅读
如果您的队列不是用于共享或传递,而是用于在单个函数中本地使用,那么您可以提供一个append
样式的接口,在该接口中,操作将返回一个修改过的队列,但此时您可能只想这样做
(如果您的队列要同时使用,请仔细考虑使用缓冲通道。这可能不是您想象的那样,但实现者已经为您解决了许多棘手的问题。)
另外--如果
Queue
确实是一个添加了方法的切片,您可以将其设置为type Queue[]int
简短回答:您可以返回其中任何一个,但我认为您通常希望返回希望人们使用最多的表单。通常,当它是像time.time
这样的小类型时,您会返回一个值,否则返回一个指针。在回答中说些更详细的话。谢谢你的详细回答。我可能会在接下来的几天内增加我的队列,所以我会将其保留为一个结构。Oops单击“发送”太早了。我不明白的是:如果我上面返回的两种情况不同,那么之后的用法为什么是相同的呢?也就是说,无论我最终初始化了什么队列
,我都在使用它,不管它是值还是指针,这就是为什么我想知道这种区别是否值得;去掉<代码> < <代码> VS >代码> ->代码>区别C++中存在,但其他差异仍然存在。例如,在q:=NewQueue()
之后,要将q
传递给func f(q*Queue)
您需要使用f(&q)
如果q
是一个值,但如果它是一个指针,则只需使用f(q)
。类似地,如果您试图将队列
或*队列
存储在全局或类似的存储中,则在没有显式&
/*
的情况下,无法在指针和值之间赋值。明白了,这里的关键是隐藏区别。非常感谢。
func NewQueue() *Queue {
queue := &Queue{}
return queue
}