Гадюка не учитывает теги yaml в моих структурах на демаршаллинг - PullRequest
0 голосов
/ 26 июня 2019

когда я использую метод Unmarshal viper для заполнения структур конфигурации значениями в моем файле yaml, некоторые поля struct стали пустыми! Я делаю это так:

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"`
}

Здесь поля url и location заполнены правильными значениями в файле yaml, но остальные поля пусты!

Интересно, что когда я пытаюсь напечатать поле наподобие:

viper.Get("endpoints.access_key")

печатает правильное значение в файле yaml, а не является пустым !!

1 Ответ

0 голосов
/ 26 июня 2019

Наконец-то найдено решение: изменение тегов yaml: на mapstructure: решит проблему.

Похоже, что viper не смог разархивировать поля, которые не имеют одно и то же имя ключа в моем .yaml файле. Подобно access_key и secret_key в вопросе, вызовите поля структуры, где AccessKey и SecretKey.

Но такие поля, как location и url, которые имели одинаковые имена в структуре и .yaml файле, и проблем не было.

Как этот выпуск говорит:

Проблема в том, что viper использует пакет mapstructure для unmarshalling config сопоставляет со структурами. Он не поддерживает теги yaml используется пакетом yaml.

Таким образом, изменение yaml: в тегах на mapstructure: устранило проблему.

...