在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精品网络服务器。拒绝绕路,拒绝不稳定。