”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Go 中向同一数组中的切片追加内容时会发生变量覆盖?

为什么 Go 中向同一数组中的切片追加内容时会发生变量覆盖?

发布于2024-11-10
浏览:448

Why Does Variable Overwrite Occur in Go When Appending to Slices from the Same Array?

Go 中变量覆盖的原因

您的代码遇到变量覆盖问题,因为您通过将元素附加到同一后备数组来创建新切片(pathA 和 pathB) (路线)在循环内。

切片的背景Go:

  • Go 切片是一种数据结构,表示相同类型元素的连续块。
  • 切片有一个长度(当前存储的元素数量) )和容量(它可以容纳的最大元素数量)。
  • 当您修改切片时,如果容量为

您的代码有问题:

在您的代码中,您正在使用附加函数创建两个新切片,pathA 和 pathB:

pathA := append(route, nextA)
pathB := append(route, nextB)

发生的情况如下:

  1. 最初,route 的容量可以容纳 nextA 和 nextB。因此,使用与路由相同的后备数组创建两个新切片(pathA 和 pathB)。
  2. 随着循环的进行并且继续追加到路由,其容量最终会超过其长度。
  3. 在循环的后续迭代中,为路由分配一个新的后备数组。但是,pathA 和 pathB 仍然引用旧的后备数组。
  4. 当您将 nextB 附加到路由时,它会写入旧后备数组的最后一个元素,该元素由 pathA 和 pathB 共享。
  5. 因此,pathA 和 pathB 的最终结果相同value.

解决方案:

要避免这种覆盖,您需要确保 pathA 和 pathB 具有唯一的后备数组。您可以通过使用 make 和 copy 手动为其中一个创建一个新切片来实现此目的:

newRoute := make([]int, len(route), (cap(route) 1)*2)
copy(newRoute, route)
if i % 2 == 0 {
    pathA := append(newRoute, nextA)
} else {
    pathB := append(newRoute, nextB)
}
版本声明 本文转载于:1729727920如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3