Go 变量被覆盖(Bug?)
设置多个变量时会出现此问题,每个变量都是通过将元素附加到现有切片来定义的,但是当设置第二个变量时,一个变量会被覆盖。
考虑以下代码片段:
<code class="go">for i := 0; i < len(prePaths); i++ { route := prePaths[i] nextA := nextLine[i] nextB := nextLine[i+1] pathA := append(route, nextA) pathB := append(route, nextB) postPaths = append(postPaths, pathA) postPaths = append(postPaths, pathB) }</code>
问题出在循环的第二行,其中 'pathA' 和'pathB' 被定义为附加元素的切片。但是,追加到切片不会创建新切片;而是会创建新切片。相反,它会修改现有切片。
在这种情况下,“route”是要附加到的现有切片。因此,当创建“pathA”时,它与“route”共享相同的底层数组。随后,当创建“pathB”时,它也与“pathA”共享相同的数组。
由于“pathB”是附加到的最后一个切片,因此基础数组中的最后一个元素将设置为附加的值到“路径B”。因此,共享相同数组的“pathA”也反映了这一变化。这解释了为什么设置“pathB”时“pathA”会被覆盖。
要解决此问题,必须为“pathA”和“pathB”创建独立的切片。这可以通过使用“make”和“copy”函数来实现。
这是一个修改后的代码片段,用于创建独立的切片:
<code class="go">for i := 0; i < len(prePaths); i++ { newRoute := make([]int, len(prePaths[i]), (cap(prePaths[i])+1)*2) copy(newRoute, prePaths[i]) nextA := nextLine[i] nextB := nextLine[i+1] pathA := append(newRoute, nextA) pathB := append(prePaths[i], nextB) postPaths = append(postPaths, pathA) postPaths = append(postPaths, pathB) }</code>
在此代码中,“newRoute”是一个使用“make”函数创建的新切片,确保它具有独立的数据。然后使用“copy”函数将数据从“prePaths[i]”复制到新切片“newRoute”中。之后,使用独立的切片定义'pathA'和'pathB',解决了最初的问题。
以上是为什么附加多个切片时 Go 变量会被覆盖?的详细内容。更多信息请关注PHP中文网其他相关文章!