写点什么

golang for 循环 append 的数据重复

  • 2024-11-18
    四川
  • 本文字数:956 字

    阅读完需:约 3 分钟

golang for循环append的数据重复

在 Go 语言中,我们经常使用 for 循环和 append 函数来处理切片。然而,有时候你可能会遇到一个问题,那就是在 for 循环中 append 的数据出现重复。这个问题通常是由于在循环中使用了指针或引用类型导致的。

首先,我们来看一个简单的例子:

type Person struct {    Name string}
people := []Person{{Name: "Alice"}, {Name: "Bob"}, {Name: "Charlie"}}var pointers []*Person
for _, person := range people { pointers = append(pointers, &person)}
复制代码

在这个例子中,我们创建了一个 Person 类型的切片 people,然后在 for 循环中将每个 Person 的地址添加到了 pointers 切片中。然而,当我们打印 pointers 时,你会发现所有的元素都是"Charlie",这是因为在 for range 循环中,person 变量的地址在每次循环时并没有改变,它一直指向同一个内存地址,而这个地址存储的值在每次循环时被更新。所以,当循环结束时,所有的指针都指向了最后一个元素。

为了解决这个问题,我们需要在每次循环时创建一个新的变量,这样每个元素就会有一个唯一的地址。我们可以通过将 person 变量赋值给一个新的变量来实现这一点:

for _, person := range people {    p := person    pointers = append(pointers, &p)}
复制代码

在这个修改后的例子中,我们在每次循环时都创建了一个新的变量 p,并将 person 的值赋给了 p。然后,我们将 p 的地址添加到了 pointers 切片中。这样,每个元素都会有一个唯一的地址,因此当我们打印 pointers 时,就会得到我们期望的结果。

总的来说,当你在 Go 语言的 for 循环中使用 append 函数时,你需要注意是否在循环中使用了指针或引用类型。如果是的话,你需要确保在每次循环时都创建一个新的变量,以避免数据重复的问题。这是因为在 for range 循环中,循环变量的地址在每次循环时并没有改变,而这个地址存储的值在每次循环时被更新。所以,如果你直接将循环变量的地址添加到切片中,那么所有的元素都会指向最后一个元素。通过在每次循环时创建一个新的变量,你可以确保每个元素都有一个唯一的地址,从而避免数据重复的问题。

蓝易云-五网CN2服务器【点我购买】蓝易云采用KVM高性能架构,稳定可靠,安全无忧!蓝易云服务器真实CN2回国线路,不伪造,只做高质量海外服务器。


海外免备案云服务器链接:www.tsyvps.com

蓝易云香港五网 CN2 GIA/GT 精品网络服务器。拒绝绕路,拒绝不稳定。

用户头像

百度搜索:蓝易云 2023-07-05 加入

香港五网CN2免备案服务器

评论

发布
暂无评论
golang for循环append的数据重复_百度搜索:蓝易云_InfoQ写作社区