【发布时间】:2021-03-24 17:34:18
【问题描述】:
我需要一些帮助来处理 golang 中的配置文件。
我为隐私重命名了每个字段和值(只是说)
我有这个 yaml 配置文件:
Label1:
field1: value1
field2: value2
field3: value3
field4: value4
Label2:
field1: value1
field2: value2
field3: value3
field4: value4
Label3:
field1: value1
field2: value2
field3: value3
field4: value4
我正在使用https://github.com/kylelemons/go-gypsy/tree/master/yaml 将此 yaml 文件手动解码为以下结构(手动遍历节点列表)。我无法控制该文件上有多少“标签”项,因此我需要一种通用的解析方式(并且使用上述库是通用的)
type Obj struct {
Field1 string `yaml:"field1"`
Field2 string `yaml:"field2"`
Field3 string `yaml:"field3"`
Field4 bool `yaml:"field4"`
}
type ObjConfig struct {
Objs map[string]Obj
}
我还有其他几个配置文件,要简单得多,我可以使用以下注释对其进行解码:
type conf1 struct {
Field1 int `yaml:"field1"`
Field2 string `yaml:"field2"`
}
我正在为这些使用自动 yaml Unmarshal(通过 Viper 框架),它工作正常。
到目前为止,混合这两种处理配置文件的方式并不是什么大问题。但是现在我需要从我设置的 spring 配置服务器中检索文件,而不是在本地保存文件。我正在使用这个库来这样做: https://github.com/Piszmog/cloudconfigclient
它适用于带有yaml:"fieldX" 注释的结构,我可以直接反序列化它。
但是对于第一个结构当然它不起作用,我需要一个解决方法。该库 (cloudconfigclient) 使用的是经典的 yaml 解码器,因此我无法编写自己的自定义解码器。查看它使用此代码反序列化配置文件的库代码(resp.Body 是 yaml 配置文件内容):
var dest interface{}
yaml.NewDecoder(resp.Body).Decode(dest)
我可以更改配置文件结构,只要我能在其中获得相同的数据。也许我可以使用类似的东西
Labels:
- Label1:
field1: value1
field2:value2
....
- Label2:
field1:value1
....
并使用 unmarshal 的 yaml 映射处理?
我显然没有使用 golang 的经验,我很想在这里得到一些帮助。
总而言之,问题是如何使用 yaml.Unmarshal 和经典解码器解码第一个 yaml 文件(通过我不知道的特定注释,或更改 yaml 结构本身)。
【问题讨论】:
-
问题到底是什么?
-
对不起,很多上下文,但问题不是很清楚,我已经编辑它并试图在最后总结问题。
-
你试过了吗yaml.to-go.online
-
我刚刚尝试过,但它不起作用,因为我需要一种通用的解析方式(我无法控制配置文件中有多少标签项)。
-
您可以使用 Viper 包来处理几乎任何类型的配置文件。这就是我用于我的项目的东西github.com/spf13/viper