【问题标题】:Viper is not considering the yaml tags in my structs on unmarshallingViper 在我的解组结构中没有考虑 yaml 标签
【发布时间】:2019-11-08 11:15:01
【问题描述】:

当我使用 viper 的 Unmarshal 方法用我的 yaml 文件中的值填充我的配置结构时,一些结构字段变为空! 我是这样做的:

viper.SetConfigType("yaml")
viper.SetConfigName("config")
viper.AddConfigPath("/etc/myapp/")
viper.AddConfigPath(".")

err := viper.ReadInConfig()
// error checking ...
conf := &ConfYaml{}
err = viper.Unmarshal(conf)
// error checking ...

我的结构是这样的:

type ConfYaml struct {
    Endpoints SectionStorageEndpoint `yaml:"endpoints"`
}

type SectionStorageEndpoint struct {
    URL       string `yaml:"url"`
    AccessKey string `yaml:"access_key"`
    SecretKey string `yaml:"secret_key"`
    UseSSL    bool   `yaml:"use_ssl"`
    Location  string `yaml:"location"`
}

这里urllocation字段在yaml文件中填充了正确的值,但其他字段为空!

奇怪的是,当我尝试打印如下字段时:

viper.Get("endpoints.access_key")

它在yaml文件中打印正确的值并且不为空!!

【问题讨论】:

  • 您能否提供一个完整可验证的示例,并附上实际输出和您的预期?
  • @Flimzy 是的,我更新了问题,希望够了。
  • 所以你认为它是空的?
  • @Flimzy 不,我希望所有字段都用 yaml 文件中的值填充。但是某些值(例如 url 和 location)已填充,而其他值则为空!当我用 viper.Get() 打印空的时,它们不是空的!所以解组方法对我来说不能正常工作。

标签: go yaml viper-go


【解决方案1】:

终于找到了解决办法,把yaml:标签改成mapstructure:就可以解决问题了。

似乎 viper 无法解组我的 .yaml 文件中没有相同键名的字段。就像问题中的access_keysecret_key 一样,导致AccessKeySecretKey 所在的结构字段。

但是像locationurl这样的字段在struct和.yaml文件中同名,没有问题。

正如this issue 所说:

问题是viper 使用 mapstructure 包 解组配置映射到结构。它不支持 yaml 标签 由 yaml 包使用。

因此将标签中的yaml: 更改为mapstructure: 已解决问题。

【讨论】:

  • viper 首先将所有字段解组为一个空接口,然后使用mapstructure 包将其解组为特定结构。
  • 所以问题在于无法理解yaml:标签的mapstructure?
  • mapstructure 将给定的字符串转换为空接口映射到一个结构,因此它不能理解 yaml 标签:)
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多