Slice不断循环填充旧条目

时间:2019-07-04 22:23:45

标签: go

我在循环在片上实现的队列时看到一种奇怪的现象,而我以前从未经历过:

fmt.Printf("BEFORE LOOP\n")

for len(queue) > 0 {
    fmt.Printf("BEFORE-QUEUE=(%d) %v\n", len(queue), queue)
    currentPath, queue := queue[0], queue[1:]
    fmt.Printf("PATH=[%s] AFTER-QUEUE=(%d) %v\n", currentPath, len(queue), queue)
}

fmt.Printf("AFTER LOOP\n")

输出:

BEFORE LOOP
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
PATH=[../../test/asset] AFTER-QUEUE=(0) []
BEFORE-QUEUE=(1) [../../test/asset]
...

这是通过1.11.4版下的“ go run”运行的。我不确定在我的情况/设计中是什么触发了此行为。

想法/分析?

2 个答案:

答案 0 :(得分:2)

您正在创建新的队列变量(由于:=)。试试:

currentPath := queue[0]
queue = queue[1:]

答案 1 :(得分:0)

好吧,所以发生的是我们正在使用短变量赋值(new-assignment运算符“:=”“)来分配新变量并更新队列(出于方便,合并为多次赋值) 。这是在块内创建 queue new 实例,该实例的作用域优先于外部块中分配的作用域。因此,在循环主体的当前迭代中,我们有一个 queue 临时实例,该实例可能为空,但在迭代结束时被丢弃。要针对当前用例解决此问题,请预定义 currentPath ,然后切换为使用“ =”而不是“:=”:

for len(queue) > 0 {
    var currentPath string
    currentPath, queue = queue[0], queue[1:]
}
相关问题