亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號