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

假设我有以下结构:


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?


三国纷争
浏览 91回答 1
1回答

肥皂起泡泡

通常,当您想按某个值聚合某些内容时,您会使用地图。键将是您要聚合的值,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无法比较,您将不得不求助于使用循环而不是映射查找,您必须手动检查等价性,如果找到匹配项,您将执行附加操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go