Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
使用切片在Go中实现简单队列_Go - Fatal编程技术网

使用切片在Go中实现简单队列

使用切片在Go中实现简单队列,go,Go,我正在尝试使用切片在Go中实现一个非常简单的队列。这是我必须将五个值排队,然后丢弃前两个值的代码: 主程序包 进口( “fmt” ) 变量( localQ[]int ) func main(){ fmt.Printf(“%v%v\n”,localQ,len(localQ)) 对于i:=0;i

我正在尝试使用切片在Go中实现一个非常简单的队列。这是我必须将五个值排队,然后丢弃前两个值的代码:

主程序包
进口(
“fmt”
)
变量(
localQ[]int
)
func main(){
fmt.Printf(“%v%v\n”,localQ,len(localQ))
对于i:=0;i<5;i++{
localQ=enqueue(localQ,i)
fmt.Printf(“%v%v\n”,localQ,len(localQ))
}
localQ=dequeue(localQ,2)
fmt.Printf(“%v%v\n”,localQ,len(localQ))
}
func排队(q[]int,n int)([]int){
q=附加(q,n)
返回q
}
func出列(q[]int,s int)([]int){
r:=q[s:]
q=零
返回r
}
关于出列功能的两个问题:

1-我正在努力确保弹出的项目被丢弃,垃圾被收集。此函数是否会导致它们被垃圾收集

2.
r:=q[s:
的时间和空间复杂性是什么?我知道每个切片下都有一个数组。是否正在复制数组值?或者它只是一个被复制的指针

此函数是否会导致它们被垃圾收集

如果应用程序将足够数量的元素排入队列,以导致重新分配切片备份阵列,则先前的备份阵列(及其元素)将符合收集条件

r:=q[s:]的时间和空间复杂性是什么


这是一个O(1)操作。该操作不会在堆上分配内存

阅读为什么不使用频道?@not_a_高尔夫球手如果我们使用频道,有没有一种方法可以执行“窥视”,即获取队列中的第一个
n
项目而不将其从队列中移除?@svakili表达式
len(c)
会告诉您一个频道中有多少元素,但是,如果不使用接收操作弹出值,则无法检查这些值。使用通道实现的队列具有固定容量。这可能是好事,也可能不是好事,这取决于应用程序的要求。@svakili,还要注意,这里提供的函数没有任何价值,因为直接使用
append
q[s::
没有区别,函数的存在可能会引起混淆。切片的行为非常简单,任何更复杂的东西(即提供安全的并发性)都可以更好地封装在带有方法的结构中。