我正在从这里使用出色的毒蛇库:https : //github.com/spf13/viper
我正在尝试读取hcl中的配置文件(尽管它也可能是JSOn或YAML文件),如下所示:
interval = 10 statsd_prefix = "pinger" group "dns" { target_prefix = "ping" target "dns" { hosts = [ "dnsserver1", "dnsserver2" ] } }
到目前为止,我的代码如下:
viper.SetConfigName("config") viper.AddConfigPath(".") err := viper.ReadInConfig() if err != nil { panic(fmt.Errorf("Fatal error config file: %s \n", err)) } interval := viper.GetInt("interval") prefix := viper.GetString("statsd_prefix") groups := viper.GetStringMap("group") fmt.Println(interval) fmt.Println(prefix)
我遇到的最大问题是使用group选项。这可以是多个不同的组。
当我在使用中阅读它时viper.GetStringMap,它似乎不起作用,所以我使用了标准viper.Get函数。转储时,结果结构如下所示:
viper.GetStringMap
viper.Get
([]map[string]interface {}) (len=1 cap=1) { (map[string]interface {}) (len=1) { (string) (len=3) "dns": ([]map[string]interface {}) (len=1 cap=2) { (map[string]interface {}) (len=2) { (string) (len=13) "target_prefix": (string) (len=4) "ping", (string) (len=6) "target": ([]map[string]interface {}) (len=1 cap=1) { (map[string]interface {}) (len=1) { (string) (len=8) "dns": ([]map[string]interface {}) (len=1 cap=1) { (map[string]interface {}) (len=1) { (string) (len=5) "hosts": ([]interface {}) (len=2 cap=2) { (string) (len=18) "dnsserver1", (string) (len=18) "dnsserver2" } } } } } } } } }
我使用反射时似乎是切片类型。我需要将其切成薄片吗?我怎么做?有没有更简单的方法来管理这样的数据结构?
我是golang的新手,所以请放轻松:)
建议不要先描述您想要的配置结构,而不是调用原始Get,然后再确定要得到什么,就像
type config struct { interval int `mapstructure:"Interval"` statsdPrefix string `mapstructure:"statsd_prefix"` groups []group } type group struct { group string `mapstructure:"group"` targetPrefix string `mapstructure:"target_prefix"` targets []target } type target struct { target string `mapstructure:"target"` hosts []string `mapstructure:"hosts"` }
而不是在其中解组(解码)
var C config err := viper.Unmarshal(&C) if err != nil { t.Fatalf("unable to decode into struct, %v", err) }
假设解码器足够聪明,可以在可能的情况下取消所提供的结构。