Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 在初始化方法中返回指针和值之间的差异_Pointers_Go - Fatal编程技术网

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
}