2016-08-15 37 views
1

我使用的是优秀的毒蛇库从这里:https://github.com/spf13/viper阅读地图与Golang蝰蛇片

我想在盐酸一个配置文件读取(虽然它可能是一个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) 

我遇到最大的问题是跟团的选择。这可以是多个不同的组。

当我在使用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" 
     } 
     } 
     } 
    } 
    } 
    } 
    } 
} 
} 

当我使用反射时,它似乎是slice类型。我需要将它投射到切片上吗?我怎么做?有没有更简单的方法来管理这样的数据结构?

我完全新的golang,所以请去容易对我:)

回答

4

相反的通话原料获取,然后再决定你得到我建议首先描述所需的配置结构,有点像

什么在它
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) 
} 

假定解码器是足够聪明在提供结构unmurshall如果可能的和有意义的。

+0

一旦Unmarshalled,值是如何提供的? – jaxxstorm

+0

我得到错误'undefined:grope' for this – jaxxstorm

+0

values can be available as interv:= C.interval or in for loop for grp:= range C.groups {for trg:= range grp {...}}错误很可能是因为拼写错误而导致的。 – Uvelichitel