假设我有以下结构:type A struct { Field1 string Field2 string}type B struct { Field3 string Field4 int}还有一个使用前两个的结构:type C struct { A MyList []B}现在,我有一些数据要分组并映射到一个C结构中并返回一个切片C:var results []C我有一个结构片段,看起来像(因为如果可能发生我们重复 A 的片段):type X struct { A B}所以我想按 A 对结果进行分组。为此,我将遍历我的方法作为参数接收的 X 切片:var results []C// Y is an slice of Xs for _, elem := range Y { // If elem.A exists then append elem.B into C.A // If not then add elem.A and elem.B into C}如何实现上述评论中所述的东西?我的意思是,我如何检查结构A切片中是否已经存在结构C?
1 回答
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
通常,当您想按某个值聚合某些内容时,您会使用地图。键将是您要聚合的值,A在您的情况下是类型。
这在这里也是最简单的,这只需要密钥类型是可比较的。
您可以像这样简单地收集数据:
// Example data:
xs := []X{
{A{"a1", "a2"}, B{"b1", 2}},
{A{"a1", "a2"}, B{"b11", 22}},
{A{"a1", "a3"}, B{"b4", 5}},
}
m := map[A][]B{}
for _, x := range xs {
m[x.A] = append(m[x.A], x.B)
}
fmt.Println(m)
这将输出:
map[{a1 a2}:[{b1 2} {b11 22}] {a1 a3}:[{b4 5}]]
如果您确实需要结果[]C,请遍历地图并填充它:
for a, bs := range m {
results = append(results, C{a, bs})
}
fmt.Println(results)
这将输出:
[{{a1 a2} [{b1 2} {b11 22}]} {{a1 a3} [{b4 5}]}]
试试Go Playground上的示例。
如果有任何机会A无法比较,您将不得不求助于使用循环而不是映射查找,您必须手动检查等价性,如果找到匹配项,您将执行附加操作。
- 1 回答
- 0 关注
- 90 浏览
添加回答
举报
0/150
提交
取消