Go 替换viper地图键而不替换整个地图
我的配置使用viper。如何在不替换整个地图的情况下替换密钥Go 替换viper地图键而不替换整个地图,go,viper-go,Go,Viper Go,我的配置使用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 :
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”不能工作。从文档上看,我猜是因为这个原因 但是,如果datastore.metric被立即值覆盖(通过标志、环境变量、Set()方法等),则datastore.metric的所有子键都将被未定义,它们将被更高优先级的配置级别“隐藏” 因此,只要设置了
people.bob
,people
就开始存在,people.*
不再被视为无人居住
我不知道如何解决这个问题。我想这是有道理的,但话说回来,这是没有道理的。@kristen可能值得报道为一个bug/misfeature。闻起来像是实现的一个怪癖,而不是一个特性。