为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 检查结构切片中的现有项目

Golang 检查结构切片中的现有项目

Go
三国纷争 2022-10-24 10:19:04
假设我有以下结构: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无法比较,您将不得不求助于使用循环而不是映射查找,您必须手动检查等价性,如果找到匹配项,您将执行附加操作。


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信