【发布时间】:2021-03-30 11:34:19
【问题描述】:
我正在尝试将切片用作队列数据结构,并且我想出了这个实现,这会导致无限循环。这是因为 queue 切片不会使用子切片 queue[1:] 进行更新。
func badQueue() {
queue := []int{0,1,2,3,4,5}
for len(queue) > 0 {
current, queue := queue[0], queue[1:]
fmt.Println(current, queue)
}
}
0 [1 2 3 4 5]
0 [1 2 3 4 5]
0 [1 2 3 4 5]
0 [1 2 3 4 5]
0 [1 2 3 4 5]
...
我发现问题与我重新声明 current 和 queue(使用 :=)而不是分配值有关,这解决了问题:
func goodQueue() {
queue := []int{0,1,2,3,4,5}
var current int
for len(queue) > 0 {
current, queue = queue[0], queue[1:]
fmt.Println(current, queue)
}
}
0 [1 2 3 4 5]
1 [2 3 4 5]
2 [3 4 5]
3 [4 5]
4 [5]
5 []
我知道导致问题的原因,但我不完全理解为什么在这种情况下重新声明操作与分配的工作方式不同。为什么队列没有用队列的子片(queue[1:])重新声明?
谢谢!
【问题讨论】:
-
“我不完全理解为什么在这种情况下重新声明操作的工作方式与分配不同。” -- 因为 Go 是 block scoped。