
go循环取值
这个bug是我在生产环境中真实遇到的,发现一个列表字段的值都长的一样,但是从数据库读出来的值却是正常的,所以就出在了处理数据的逻辑上。
这个bug在Go 1.22之前很常见,新版本无法复现
大概的逻辑如下
正常想要的是 [{"name":"Alice","age":28},{"name":"Kk","age":2},{"name":"Sd","age":28}]
但是 结果确是 [{"name":"Sd","age":28},{"name":"Sd","age":2},{"name":"Sd","age":28}]
主要原因是因为取值用的是 &person.Name , 每次循环 person 都是在变的
go
func main() {
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
type Person2 struct {
Name *string `json:"name"`
Age int `json:"age"`
}
var list = []Person{
{Name: "Alice", Age: 28},
{Name: "Kk", Age: 2},
{Name: "Sd", Age: 28},
}
var list2 []Person2
for _, person := range list {
list2 = append(list2, Person2{
Name: &person.Name,
Age: person.Age,
})
}
fmt.Printf("%+v\n", json_util.ToJSON(list2))
}
