如何将映射添加到用于反序列化 json 配置的同一结构中?

How to add map into the same struct which is used to deserialize json configs?

我正在将 json 反序列化为结构,如下所示,它工作正常。

type DataConfigs struct {
    ClientMetrics []Client `json:"ClientMetrics"`
}

type Client struct {
    ClientId  int  `json:"clientId"`
    .....
    .....
}

const (
    ConfigFile = "clientMap.json"
)

func ReadConfig(path string) (*DataConfigs, error) {
    files, err := utilities.FindFiles(path, ConfigFile)
  // check for error here
  
    var dataConfig DataConfigs
    body, err := ioutil.ReadFile(files[0])
  // check for error here
    err = json.Unmarshal(body, &dataConfig)
  // check for error here

    return &dataConfig, nil
}

现在我正在尝试使用如上代码所示创建的 DataConfigs 对象构建 integerClient 的映射。所以我创建了一个方法来完成这项工作,如下所示,我也修改了 ReadConfig 方法来完成这项工作。

func ReadConfig(path string, logger log.Logger) (*DataConfigs, error) {
  files, err := utilities.FindFiles(path, ConfigFile)
  // check for error here
  
  var dataConfig DataConfigs
  body, err := ioutil.ReadFile(files[0])
  // check for error here
  err = json.Unmarshal(body, &dataConfig)
  // check for error here

  idx := BuildIndex(dataConfig)
  // now how to add this idx and dataConfig object in one struct?
  
  return &dataConfig, nil
}

func BuildIndex(dataConfig DataConfigs) map[int]Client {
    m := make(map[int]Client)
    for _, dataConfig := range dataConfig.ClientMetrics {
        m[dataConfig.ClientId] = dataConfig
    }
    return m
}

我的困惑是 - 我是否应该修改 DataConfigs 结构以添加 idx 映射然后 return 来自 ReadConfig 方法的结构还是应该创建一个新结构处理那个?

基本上我想要 return DataConfigs 结构,它有 ClientMetrics 数组和 idx 映射。我怎么能在这里做到这一点?我有点困惑,因为我最近开始使用 golang

这基本上是一个有多个选项的设计题。首先,我会避免将地图添加到您的原始 DataConfigs 类型,因为它与 json 表示不匹配。这可能会导致混淆。

选择哪个选项取决于您的要求和偏好。我脑海中的一些想法:

  1. 您是否考虑过 return 仅查看地图?毕竟,您的地图中包含了每个客户。如果您需要迭代所有客户端,您可以迭代地图的所有值。
  2. 第二个选项是 return 除了 DataConfigs 之外的地图。 Go 允许 return 来自一个函数的多个值,就像您已经为错误处理所做的那样。
  3. 最后,您可以像您已经猜到的那样将 DataConfigs 和您的地图包装在一个新的简单结构类型中。