Skip to content
鼓励作者:欢迎打赏犒劳

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))
}

如有转载或 CV 的请标注本站原文地址