我在循环在片上实现的队列时看到一种奇怪的现象,而我以前从未经历过:
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”运行的。我不确定在我的情况/设计中是什么触发了此行为。
想法/分析?
答案 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:]
}