【发布时间】:2022-01-01 02:52:20
【问题描述】:
我最近开始与golang 合作,因此很难理解如何实现相同的目标,而我可以在Java 或C# 中轻松做到这一点。我正在尝试创建configmanager 类的对象,当第一次调用configmanager 类时,它应该初始化我的所有配置并将其存储在内存中的某个结构对象中。然后我应该可以访问 configmanager 对象,并且应该能够使用一些 getter 从我的主函数访问所有这些配置?
下面是我的configmanager 上课。现在很简单,让它更容易理解。
package config
import (
"encoding/json"
"fmt"
"io/ioutil"
"github.com/david/internal/utilities"
)
type ClientMetrics struct {
ClientMetrics []ClientMetric `json:"clientMetrics"`
}
type CustomerData struct {
Process []string `json:"Process"`
Mat []string `json:"Mat"`
}
type ClientMetric struct {
ClientID int `json:"clientId"`
CustomerData CustomerData `json:"customerData,omitempty"`
LegCustomer []int `json:"legCustomer"`
OtherIds []int `json:"otherIds,omitempty"`
CatID int `json:"catId,omitempty"`
}
func Init(root string) (err error) {
files, err := utilities.FindFiles(root, "process-data.json")
if err != nil {
return fmt.Errorf("cannot find process-data.json file: %v", err)
}
for _, file := range files {
body, err := ioutil.ReadFile(file)
if err != nil {
return fmt.Errorf("unable to read file: %v", err)
}
var auto ClientMetrics
json.Unmarshal(body, &auto)
}
return nil
}
这是我在我的主要功能中使用它 - 这只是基本代码,只是为了演示我在做什么,但这不是 production 准备好的代码。
package main
import (
"github.com/david/internal/config"
)
func main() {
root := "/home/Configurations"
config.Init(root)
//
}
在我上面的Init 函数中,如果process-data.json 文件在磁盘上,我会找到它,然后通过将其反序列化为ClientMetrics 对象将其加载到内存中。如上所示,一切正常。
问题陈述
由于我来自Java 和C# 背景,所以我的困惑是如何创建configmanager 类的对象,以及我应该如何在第一次调用configmanager 时初始化所有配置并且还可以使用一些 getter 访问 ClientMetrics 结构。在 Java 和 C# 中,我曾经使用构造函数来初始化所有这些东西,然后使用一些 getter 来访问配置。我应该如何在 golang 中做同样的事情。
我的主要困惑是我们在 go 中是否有构造函数,我应该如何让 getter 访问我的 main 函数中的结构对象?我只是在 go 中寻找更好的设计,我应该如何在 golang 中执行上述代码?
更新
我想我无法正确解释。我在一个文件夹中有 X 个(现在假设 5 个)不同的 json 文件,每个 json 文件都需要有自己的结构,因为它们是完全不同的 json 文件。我的configmanager 文件将负责将所有这 5 个 json 文件加载到它们自己的结构中,然后我应该能够从configmanager 的对象访问所有这 5 个structs 及其字段。这一切都应该发生在configmanager类第一次被调用时的初始化过程中。
这只是一个示例,我在它们自己的相应文件夹(folderX) 中有一堆 json 文件。我有如下三类文件(clientMap-*.json, dataMap-*.json, process-data.json)。
Products
├── folder1
│ ├── clientMap-123.json
│ ├── clientMap-987.json
│ ├── clientMap-7161.json
├── folder2
│ ├── dataMap-18271.json
│ ├── dataMap-12921.json
│ ├── dataMap-98121.json
└── folder3
├── process-data.json
现在我需要在它们自己的结构中读取所有这些文件(clientMap-*.json, dataMap-*.json, process-data.json)。而且我应该能够在解组后使用configmanager 类来获取相应的结构及其字段。
例如:读取clientMap-*.json文件。
files, err := utilities.FindFiles(root, "clientMap-*.json")
// load all clientMap-*.json files in its own struct after unmarshalling
dataMap-*.json 文件也是如此
files, err := utilities.FindFiles(root, "dataMap-*.json")
// load all dataMap-*.json files in its own struct after unmarshalling
也适用于process-data.json 文件
files, err := utilities.FindFiles(root, "process-data.json")
// load all process-data.json files in its own struct after unmarshalling
我的FindFiles 方法将找到所有文件,即使是上面的regex。 files 变量是一个数组,其中包含与特定模式匹配的所有文件的列表。现在我可以为我的配置创建ConfigManager 结构类型来保存所有其他structs,但我正在尝试找到一个易于扩展的解决方案,以便将来如果我添加任何其他json文件类别,它应该能够轻松扩展。解决这个问题的正确方法是什么?
【问题讨论】:
-
是的,这就是我在阅读大量 Go 教程后之前的想法,但我的用例略有不同,因为我可以说 10 个不同的配置(文件),并且每个配置都可以有自己的结构,因为这是一个不同的配置,所以我需要为它们设置单独的结构,所以我该如何在你的建议中做到这一点?此外,即使我们可以做到这一点,那么 unmarshal 将如何工作? @CeriseLimón
-
你将如何在 Java 或 C# 中做到这一点?你是说还有一个类,但是有重载的构造函数?如果是这样,在 Go 中可以使用一个结构和不同的函数来完成(每个函数返回一个指针/引用,但只是以不同的方式构建结构)。
-
听起来 ConfigManager 应该有一个切片,其中包含从 JSON 编组的所有对象。需要切片(或地图),因为您不知道可以有多少这样的文件。 VonC 的答案中显示的组成也可能对您有所帮助。
-
在开始时,我将假设 5 个 json 文件,它们需要解组到自己的结构中,所以基本上总共 5 个结构,
ConfigManager应该负责做所有这些并提供返回每个的机制那些结构和他们的领域。您能否提供一个切片示例,如果需要可以轻松扩展?我也已经回复了 VonC 的回答。问题是我无法修改我的 json 以向其中添加类型。让我知道这是否仍然可以针对我的用例进行扩展。 @Sangam -
@CeriseLimón 我已更新我的问题以添加更多详细信息。现在让我知道这是否有意义。