我在Go中构建了一个简单的队列。它使用内部切片来跟踪其元素。元素通过附加到切片而被推送到队列中。我想实现。通过删除
。元素
中的第一个元素,弹出()
在许多其他语言中,“弹出”列表的第一个元素是一行,这使我相信下面的实现是草率和冗长的。有更好的办法吗?
type Queue struct {
elements []interface{}
}
func (queue *Queue) Push(element interface{}) {
queue.elements = append(queue.elements, element)
}
func (queue *Queue) Pop() interface{} {
element := queue.elements[0]
if len(queue.elements) > 1 {
queue.elements = queue.elements[1:]
} else {
queue.elements = make([]interface{}, 0)
}
return element
}
请注意,如果len(Queue.elements)=0,我希望
队列
死机。我没有检查边界不是疏忽。
如果您想要一个环形缓冲区或FIFO结构,那么使用@Everton的答案中的切片将导致垃圾收集问题,因为底层数组可能会无限增长。
在go中实现这一点的最简单方法是,如果您不介意限制大小,则使用一个对并发访问同样安全的通道。这是围棋中非常常见的一个习惯用法,您通常不会费心将其包装成下面这样的类型。
Eg(操场)
package main
import "fmt"
type Queue struct {
elements chan interface{}
}
func NewQueue(size int) *Queue {
return &Queue{
elements: make(chan interface{}, size),
}
}
func (queue *Queue) Push(element interface{}) {
select {
case queue.elements <- element:
default:
panic("Queue full")
}
}
func (queue *Queue) Pop() interface{} {
select {
case e := <-queue.elements:
return e
default:
panic("Queue empty")
}
return nil
}
func main() {
q := NewQueue(128)
q.Push(1)
q.Push(2)
q.Push(3)
fmt.Printf("Pop %d\n", q.Pop())
fmt.Printf("Pop %d\n", q.Pop())
fmt.Printf("Pop %d\n", q.Pop())
fmt.Printf("Pop %d\n", q.Pop())
}
你试过这些吗?
从队列中弹出
x, a = a[0], a[1:]
从堆栈弹出
x, a = a[len(a)-1], a[:len(a)-1]
推
a = append(a, x)
来自:https://code.google.com/p/go-wiki/wiki/SliceTricks
问题内容: 我在Go中建立了一个简单的队列。它使用内部切片来跟踪其元素。通过附加到切片将元素推入队列。我想通过删除中的第一个元素来实现。 在许多其他语言中,“弹出”列表的第一个元素是一个单行,这使我相信下面的实现是草率而冗长的。有没有更好的办法? 请注意,如果,我会感到恐慌。我不检查界限不是疏忽大意。 问题答案: 你尝试过这些吗? 从队列弹出 从堆栈弹出 推 来自:https : //code.g
主要内容:从开头位置删除,从中间位置删除,从尾部删除Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素,根据要删除元素的位置有三种情况,分别是从开头位置删除、从中间位置删除和从尾部删除,其中删除切片尾部的元素速度最快。 从开头位置删除 删除开头的元素可以直接移动数据指针: 也可以不移动数据指针,但是将后面的数据向开头移动,可以用 append 原地完成(所谓原地完成是指在原有的切片数据对应的内存区间内完成,不会导致
我正在使用这个命令从切片中删除一个元素,但它不起作用,请建议。
问题内容: 这个带有添加功能的删除技巧如何工作? 似乎它正在抓取第一个元素(空数组)之前的所有内容 然后将所有内容附加在第一个元素之后(位置零) …(点对点)有什么作用? 问题答案: 切片在哪里,是要删除的元素的索引: 是Go中可变参数的语法。 基本上,在 定义 函数时,它将把您传递的所有参数放入该类型的一个切片中。这样,您可以传递任意数量的参数(例如,可以传递任意数量的参数)。 现在,当 调用
问题内容: 我进行了以下测试,即打印原始输入切片(过滤后),而没有删除元素,但是最后有一个额外的元素,使输入切片具有相同的长度,即使过滤后应该较短。 我已经看过这篇文档https://github.com/golang/go/wiki/SliceTricks#delete 但是我认为我缺少有关Go的一些技巧,因为似乎我使用的切片方法错误。 如何避免出现“输出片段”?(以正确的方式打印,包含正确的元
问题内容: 我已经看过这篇文章: Python:通过删除每个第n个元素从现有列表构建新列表,但是由于某些原因,它对我不起作用: 我这样尝试: 此函数需要一个列表和。然后,它使用列表中的n步删除第n个元素,并打印结果。 这是我的函数调用: 错误的输出: 代替 然后我从上面的链接尝试了一个变体: 再次,函数调用: 给了我同样的错误的结果: 不是 如何正确地从列表中删除/删除/删除 第n个 项目? 问题