У меня есть YAML как один ниже.
connections:
- name: demo
hosts:
- demo.example.com:9200
username: admin
password: password
ssl: true
ssl_verify: true
version: 7
- name: test
hosts:
- "test.example.com:9200"
username: admin
password: password
Как видите, ssl
и ssl_verify
не установлены во втором пункте списка. Я хочу, чтобы они по умолчанию были true
, однако этого не происходит. Я пробовал разные решения.
- Viper по умолчанию - не работает.
viper.SetDefault("connections[].ssl", "true")
- https://github.com/creasty/defaults - не работает.
type Config struct {
Connections []struct {
Name string
Hosts []string
Username string
Password string
Ssl bool `default:"true"`
SslVerify bool `default:"true"`
Version int
}
}
...
err := defaults.Set(config)
Ручной цикл по списку структур. Хотя этот метод работает со строками, он не работает с логическими значениями, потому что они уже инициализированы с false
после демаршаллинга, и мы точно не знаем, введен ли пользователем false
или нет.
Использование указателей с логическими значениями. Это работает, поскольку неинициализированные значения равны nil
, и их легко поймать. Однако, это потребует разыменования указателей при использовании структуры config, что не очень удобно. Кроме того, новая структура может быть сгенерирована на основе той, которая получена в результате демаршаллинга.
type Config struct {
Connections []struct {
Name string
Hosts []string
Username string
Password string
Ssl *bool
SslVerify *bool
Version int
}
}
- Использование hashmap вместо struct. Это работает, потому что пустые значения не инициализируются, однако, потребуется выполнить проверки элементов карты перед доступом к ним или преобразовать карту в структуру.
Решения 4 и 5, вероятно, будут работать, но мне интересно, есть ли что-нибудь лучше, чем это.
Есть идеи?