我正在开发我的第一个真正的Go项目,并一直在寻找一些工具来处理配置。
最后,我找到了这个工具:https://github.com/spf13/viper这非常好,但是当我尝试处理一些更复杂的配置时遇到一些问题,例如以下config.yaml示例:
app:
name: "project-name"
version 1
models:
modelA:
varA: "foo"
varB: "bar"
modelB:
varA: "baz"
varB: "qux"
varC: "norf"
我不知道如何从modelB获取值。在查看lib代码时,我发现了以下内容,但我并不真正了解如何使用它:
// Marshals the config into a Struct
func Marshal(rawVal interface{}) error {...}
func AllSettings() map[string]interface{} {...}
我想要的是能够从我的包装中的任何地方做出类似的事情:
modelsConf := viper.Get("models")
fmt.Println(modelsConf["modelA"]["varA"])
有人可以向我解释实现这个目标的最佳途径吗?
答案 0 :(得分:8)
由于“模型”块是地图,因此调用
更容易一些m := viper.GetStringMap("models")
m将是map [string] interface {}
然后,你得到m [key]的值,这是一个接口{},所以你把它转换为map [interface {}] interface {}:
m := v.GetStringMap("models")
mm := m["modelA"].(map[interface{}]interface{})
现在您可以访问“varA”键,将密钥作为接口传递{}:
mmm := mm[string("varA")]
mmm是foo
答案 1 :(得分:2)
您可以简单地使用:
m := viper.Get("models.modelA")
或
newViperForModelA := viper.Sub("models").Sub("modelA")