替换 viper 地图键而不替换整个地图
Replace viper map key without replacing entire map
我在配置中使用 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}]
}
设置新 Bob 后,我完全失去了 John。如果我将 "SetDefault" 更改为简单的 "Set" 那么它似乎可以工作,但我想知道为什么 "SetDefault" 不起作用。
上的文档,我猜是因为这个原因
However, if datastore.metric was overridden (by a flag, an environment variable, the Set() method, …) with an immediate value, then all sub-keys of datastore.metric become undefined, they are “shadowed” by the higher-priority configuration level.
因此,一旦 people.bob
被设置,people
就会出现并且 people.*
不再被视为无人居住。
我不知道如何解决它。
我在配置中使用 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}]
}
设置新 Bob 后,我完全失去了 John。如果我将 "SetDefault" 更改为简单的 "Set" 那么它似乎可以工作,但我想知道为什么 "SetDefault" 不起作用。
However, if datastore.metric was overridden (by a flag, an environment variable, the Set() method, …) with an immediate value, then all sub-keys of datastore.metric become undefined, they are “shadowed” by the higher-priority configuration level.
因此,一旦 people.bob
被设置,people
就会出现并且 people.*
不再被视为无人居住。
我不知道如何解决它。