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

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

在 Go 上將兩個結構分組為第三個結構的最佳方法

在 Go 上將兩個結構分組為第三個結構的最佳方法

Go
繁星點點滴滴 2023-07-31 15:37:17
我有以下結構:type A1 struct {   IdA1 string   NameA1 string   key string}type B1 struct {   IdB1 string   NameB1 string   Size string   key string}type C1 struct {   IdA1 string   Name string   B1Set B1}我需要創建一個 C1 類型的 []struct,它保存 B1 的 B1Set,B1 超過 2K 個條目,而 A1 只有 10 個條目,一個非常緩慢且低效的實現是循環 A1,并詢問是否B1-key 等于 A1-key 并將結果存儲在映射中,但是..有沒有更好的方法來實現這一點?提前致謝,添加更多信息:它們是兩個不同的 JSON 文件:Json1:[  {    "id": "device1",    "name": "dev1",    "pool": "pool1"  },  {    "id": "device2",    "name": "dev2",    "pool": "pool2"  }  ...]還有另一個 Json:[  {    "name": "port1",    "size": 10,    "pool": "pool1",    "status": "active"  },  {    "name": "port2",    "size": 60,    "pool": "pool1",    "status": "active"  },  {    "name": "port3",    "size": 20,    "pool": "pool2",    "status": "down"  },  {    "name": "port8",    "size": 100,    "pool": "pool2",    "status": "active"  },  {    "name": "port10",    "size": 8000,    "pool": "pool1",    "status": "active"  },  ...]
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

這是您想要做的嗎? https://play.golang.org/p/AZNzQAwRhN0

其作用是構建一個按池對所有端口進行分組的映射。然后它循環遍歷我標記的內容clusters,并通過按值抓取匹配切片來將 的切片分配Port給匹配的切片。ClusterPool

package main


import (

    "encoding/json"

    "fmt"

)


type Cluster struct {

    ID    string `json:"id"`

    Name  string `json:"name"`

    Pool  string `json:"pool"`

    Ports []Port `json:"ports"`

}


type Port struct {

    Name   string `json:"name"`

    Size   int    `json:"size"`

    Pool   string `json:"pool"`

    Status string `json:"status"`

}


func main() {

    var resources []Port

    err := json.Unmarshal([]byte(resourceJSON), &resources)

    if err != nil {

        panic(err)

    }

    resourcesByPool := make(map[string][]Port)

    for _, resource := range resources {

        if _, ok := resourcesByPool[resource.Pool]; !ok {

            resourcesByPool[resource.Pool] = []Port{}

        }

        resourcesByPool[resource.Pool] = append(resourcesByPool[resource.Pool], resource)

    }


    var clusters []Cluster

    err = json.Unmarshal([]byte(clusterJSON), &clusters)

    if err != nil {

        panic(err)

    }

    for i := 0; i < len(clusters); i++ {

        clusters[i].Ports = resourcesByPool[clusters[i].Pool]

    }


    out, err := json.MarshalIndent(clusters, "", "    ")

    if err != nil {

        panic(err)

    }


    fmt.Println(string(out))


}


var (

    clusterJSON = `[

  {

    "id": "device1",

    "name": "dev1",

    "pool": "pool1"

  },

  {

    "id": "device2",

    "name": "dev2",

    "pool": "pool2"

  }

]`


    resourceJSON = `[

  {

    "name": "port1",

    "size": 10,

    "pool": "pool1",

    "status": "active"

  },

  {

    "name": "port2",

    "size": 60,

    "pool": "pool1",

    "status": "active"

  },

  {

    "name": "port3",

    "size": 20,

    "pool": "pool2",

    "status": "down"

  },

  {

    "name": "port8",

    "size": 100,

    "pool": "pool2",

    "status": "active"

  },

  {

    "name": "port10",

    "size": 8000,

    "pool": "pool1",

    "status": "active"

  }]`

)


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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