首页 > 后端开发 > Golang > 正文

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

Mary-Kate Olsen
发布: 2024-10-24 08:11:01
原创
396 人浏览过

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

解决方案:

要避免这种覆盖,您需要确保 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)
}
登录后复制

以上是为什么 Go 中向同一数组中的切片追加内容时会发生变量覆盖?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!