Заменить ключ карты Viper без замены всей карты
Я использую Viper для моей конфигурации. Как заменить ключ без замены всей карты?
package main
import (
"log"
"github.com/spf13/viper"
)
type person struct {
First string
Last string
}
func main() {
v := viper.New()
v.SetEnvPrefix("mememe")
v.AutomaticEnv()
bob := person{
First: "Bob",
Last: "Smith",
}
john := person{
First: "John",
Last: "Boothe",
}
v.SetDefault("people.bob", bob)
v.SetDefault("people.john", john)
log.Println(v.Get("people")) // map[bob:{Bob Smith} john:{John Boothe}]
bob.Last = "Hope"
v.Set("people.bob", bob)
log.Println(v.Get("people")) // map[bob:{Bob Hope}]
}
После установки нового Боба я полностью теряю Джона. Если я изменю "SetDefault" на "Set", то, похоже, это сработает, но мне интересно, почему "SetDefault" не работает.
1 ответ
Решение
Я собираюсь догадаться, что это из-за этого, из документов о доступе к вложенным ключам.
Однако, если datastore.metric был переопределен (с помощью флага, переменной среды, метода Set() и т. Д.) С непосредственным значением, то все вложенные ключи datastore.metric становятся неопределенными, они "затеняются" более высоким приоритетный уровень конфигурации.
Так что, как только people.bob
установлено, people
возникает и существует people.*
больше не считаются безлюдными.
Я не знаю, как обойти это.