0

当我使用Unmarshalviper 的方法用我的 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 文件中打印正确的值并且不为空

4

1 回答 1

5

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

viper 似乎无法解组我.yaml文件中键名不同的字段。就像问题中的access_keyand一样secret_key,导致结构字段 whereAccessKeySecretKey

但是像locationandurl这样的字段在结构和.yaml文件中具有相同的名称,并且没有问题。

正如这个问题所说:

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

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

于 2019-06-26T14:31:39.733 回答