最近测试反馈一个缺陷,具体表现就是:列表返回的数据中,所有的 id 列的值一样,其他字段数据正常。
导致了查看详情的时候都是一个 id 查询信息。查询代码发现是之前的开发人员在 for range 中使用的 & 符号取 item.id 地址d导致的。
在 golang 的 for range 在遍历中,item 是值拷贝不是引用,也就是 item 的内存地址值不变,每次遍历的时候里面的值会变化。如果用 &取 item的值,那么永远是最后一个值,所有 &item.id 都会是最后一条记录。
解决方式就定义一个中间变量来获取值,再赋值给想要的结果集就可以了。具体可以看下下面的例子
package main
import "fmt"
type user struct {
name string
uid int
}
func main() {
m := make(map[int]*user)
userList := []user{
{name: "张三", uid: 10},
{name: "李四", uid: 20},
{name: "王五", uid: 30},
}
for _, item := range userList {
m[item.uid] = &item
//定义中间变量接收值就可以了
//userItem := item
//m[item.uid] = &userItem
}
for k, v := range m {
fmt.Println(k, "=>", v)
}
}
因为 item 的值的地址是一样的,所以最后打印出来的结果是
10 => &{王五 30}
20 => &{王五 30}
30 => &{王五 30}
上一篇: IDEA小工具...
下一篇: Mysql 内存表的使用...
佚名 2023-02-15 16:50 Unknown 广东省云浮市