Go中使用切片的队列实现

Big*_*ian 5 queue go slice data-structures

我见过一些在 Go 中使用切片的 FIFO 队列的实现。当项目退出队列时,是否可以释放该内存而不重新分配底层数组?如果不发生这种情况,在我看来,队列将泄漏大量内存。这就是我的意思:

type queue
{
  []int
  int head
}

func (q *queue) enqueue(val int) {
   q = append(q, val)
}

func (q *queue) dequeue() int {
   return (*q)[q.head++]
}
Run Code Online (Sandbox Code Playgroud)

多次调用入队/出队后,切片下方数组的低索引不再可用,但我也不知道如何释放它们。有人可以向我指出一个不使用指针的正确队列实现,并且不会像这样泄漏内存或存在性能问题吗?或者,对其如何工作的描述也将受到赞赏。

谢谢你,普拉门

Cal*_*leb 2

您可以使用循环缓冲区。来自维基百科

循环缓冲区、循环队列、循环缓冲区或环形缓冲区是一种使用单个固定大小缓冲区的数据结构,就好像它是端到端连接的一样。这种结构很容易缓冲数据流。

...

对于具有固定最大大小的队列,循环缓冲是一个很好的实现策略。如果队列采用最大大小,那么循环缓冲区是完全理想的实现;所有队列操作都是恒定时间。然而,扩展循环缓冲区需要移位内存,成本相对较高。对于任意扩展队列,链表方法可能是首选。

这是实现此功能的包: https: //github.com/eapache/queue

根据用例,通道也是实现队列的好方法。它会阻止,但使用默认的选择可以避免这种行为:

select {
case msg := <-queue:
default:
}
Run Code Online (Sandbox Code Playgroud)