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

为什么附加多个切片时 Go 变量会被覆盖?

Mary-Kate Olsen
发布: 2024-10-24 07:59:02
原创
197 人浏览过

Why Are Go Variables Overwritten When Multiple Slices Are Appended?

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中文网其他相关文章!

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