我有一个图书清单(BookId),每本书都与一个图书收藏集(CollectionId)相关联。
我正在尝试找出按“收藏”对结果进行分组的最佳方法,因此所有属于该收藏的书籍都在其下列出,我可以通过以下方式构建结果:
书籍A,D,G属于集合1。 图书B,C,E属于馆藏2。
我将这些书放在列表/数组中,需要循环浏览并查找它们所属的collectionID,并且它们需要存储新列表,如下所示:
CollectionID 1:
- Book A, Book D, Book G
CollectionID 2:
- Book B, Book C, Book E
CollectionID 3:
- Book F
答案 0 :(得分:3)
首先,您设计数据库。例如,
package main
type CollectionId string
type Collection struct {
Id CollectionId
Name string
}
type BookId string
type Book struct {
Id BookId
Name string
Collection CollectionId
}
type Books map[BookId]Book
type Collections map[CollectionId][]BookId
func main() {}
答案 1 :(得分:1)
您可以使用地图为每个馆藏ID存储一堆书。
type Book struct {
Title string
Author string
CollectionID int
}
func main() {
books := GetBooks()
collections := make(map[int][]Book)
for _, b := range books {
collections[b.CollectionID] = append(collections[b.CollectionID], b)
}
...
}
答案 2 :(得分:0)
Golang确实缺少一些帮助程序功能(例如Php array_map
或Java stream
),他们想使它尽可能简单。
有一个https://github.com/thoas/go-funk库,提供“现代助手(地图,查找,包含,过滤器,...)”,在您的情况下,您可能会对以下方面感兴趣:
ToMap
基于枢轴字段将结构片段转换为地图。
f := &Foo{
ID: 1,
FirstName: "Gilles",
LastName: "Fabio",
Age: 70,
}
b := &Foo{
ID: 2,
FirstName: "Florent",
LastName: "Messa",
Age: 80,
}
results := []*Foo{f, b}
mapping := funk.ToMap(results, "ID") // map[int]*Foo{1: f, 2: b}