假設我有以下結構: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 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消