2016-08-15 38 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