在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循环中,循环变量的地址在每次循环时并没有改变,而这个地址存储的值在每次循环时被更新。所以,如果你直接将循环变量的地址添加到切片中,那么所有的元素都会指向最后一个元素。通过在每次循环时创建一个新的变量,你可以确保每个元素都有一个唯一的地址,从而避免数据重复的问题。


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

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

蓝易云是一家专注于香港及国内数据中心服务的提供商,提供高质量的服务器租用和云计算服务、包括免备案香港服务器、香港CN2、美国服务器、海外高防服务器、国内高防服务器、香港VPS等。致力于为用户提供稳定,快速的网络连接和优质的客户体验。
最后修改:2023 年 09 月 23 日
如果觉得我的文章对你有用,请随意赞赏