使用golang Viper lib进行高级配置

时间:2014-11-25 11:19:30

标签: go yaml config

我正在开发我的第一个真正的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"])

有人可以向我解释实现这个目标的最佳途径吗?

2 个答案:

答案 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")