如何将映射添加到用于反序列化 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
对象构建 integer
和 Client
的映射。所以我创建了一个方法来完成这项工作,如下所示,我也修改了 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 表示不匹配。这可能会导致混淆。
选择哪个选项取决于您的要求和偏好。我脑海中的一些想法:
- 您是否考虑过 return 仅查看地图?毕竟,您的地图中包含了每个客户。如果您需要迭代所有客户端,您可以迭代地图的所有值。
- 第二个选项是 return 除了 DataConfigs 之外的地图。 Go 允许 return 来自一个函数的多个值,就像您已经为错误处理所做的那样。
- 最后,您可以像您已经猜到的那样将 DataConfigs 和您的地图包装在一个新的简单结构类型中。
我正在将 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
对象构建 integer
和 Client
的映射。所以我创建了一个方法来完成这项工作,如下所示,我也修改了 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 表示不匹配。这可能会导致混淆。
选择哪个选项取决于您的要求和偏好。我脑海中的一些想法:
- 您是否考虑过 return 仅查看地图?毕竟,您的地图中包含了每个客户。如果您需要迭代所有客户端,您可以迭代地图的所有值。
- 第二个选项是 return 除了 DataConfigs 之外的地图。 Go 允许 return 来自一个函数的多个值,就像您已经为错误处理所做的那样。
- 最后,您可以像您已经猜到的那样将 DataConfigs 和您的地图包装在一个新的简单结构类型中。