关于[]map[string]interface{}的问题

来源:3-4 Map

慕后端4419857

2021-07-01

老师,您好。
现在假如有这样一个需求,从数据库查询出来的结构如下:

[
	{school:xx, grade:1, name:xx,age:12,class:3},
	{school:xx, grade:2, name:xx,age:11,class:4},
	{school:xx, grade:3, name:xx,age:13,class:2}
]

现在需要将相同字段合并,变成一个数组,数组里边是map结构,比如,同一个学校年级一样的放进一个数组,这个数组里班级相同的学生再放进一个数组里,如下:

[{
	school:xx, 
	grade:1, 
	classes:[
		{class:1, students:[{name:name1, age:14},{name:name2, age:15}]},
		{class:2, students:[{name:name1, age:14},{name:name2, age:15}]}
	]
}]

我的代码如下,往后写就报各种错误,不知道如何下手了,请教一下应该如何写出来?:
图片描述

写回答

1回答

ccmouse

2021-07-04

这段代码不仅是这个编译错误,有很大问题。我们的数据合并的依据,看起来是(school, grade),那我们对于每一个新的学生,(注意这个k是学生数组的下标,没有价值,所以不需要)。

for _, v := range students {

   ....

}

我们应该在newStu中查找school与grade与之相等的元素,再把他的class添加进去。

这里newStu定义成切片显然很麻烦(同学定义的是切片,切片里面每个元素是map)。而是应该直接定义成map,并且强类型化:(我暂且给这个我们要生成的数据起名为report)

type ReportKey struct {

  school string

  grade int

}


type ReportStudentEntry struct {

   name string

   age int   

}

newStu := make(map[ReportKey]map[int][]ReportStudentEntry)

每个ReportKey对应一个map。这个map是class(int)对应到一个ReportStudentEntry的切片。

同学试试这样的结构是不是写起来清晰很多。Go语言中我们不要害怕定义太多的struct,它们其实非常方便。(当然,这里我还没有讲到struct)

这个问题其实在实际项目中非常普遍,我在后续13-3 json数据格式的处理与13-4 第三方API数据格式的解析技巧中,讲到的思路和这里遇到的问题和困难非常类似。既然同学问了,建议学完第4章结构体之后,再配合5-3 go mod的使用,然后看13-3与13-4,彻底解决这个问题。


0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程