2016-08-15 10 views
1

Golangバイパーとマップのスライス読む:https://github.com/spf13/viper私はここから優秀な毒蛇のライブラリを使用してい

私はそれがJSONやYAMLファイルとしてすることができるが(HCl中の設定ファイルを読み込むしようとしているがウェル)、このようになりますどの:私が持っているコードは、これまでのようになります

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" 
     } 
     } 
     } 
    } 
    } 
    } 
    } 
} 
} 

反射を使用するとスライスタイプのようです。それをスライスにキャストする必要がありますか?それ、どうやったら出来るの?このようなデータ構造を簡単に管理する方法はありますか?

私はgolangに対して完全に新たなんだ、だからではなく、コールの生のGetの

答えて

4

:)私に簡単に行くと、あなたは、私が最初にご希望のconfig構造を記述することをお勧めしたい取得正確に何を決め、

ような何かしてくださいデコーダを想定し、それに
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

アンマーシャルされたら、値はどのように使用可能になりますか? – jaxxstorm

+0

私はこのエラーのために 'undefined:grope'というエラーを受け取っています – jaxxstorm

+0

値はinterv:= C.intervalまたはgrp:= rangeのためのループで利用可能ですC.groups {for trg:= range grp {...}}エラーは、誤植の原因である可能性が高いです。 – Uvelichitel

関連する問題