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

在 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 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

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