使用Golang Viper读取地图片段

我正在从这里使用出色的毒蛇库: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函数。转储时,结果结构如下所示:

([]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)

}

假设解码器足够聪明,可以在可能的情况下取消所提供的结构。

以上是 使用Golang Viper读取地图片段 的全部内容, 来源链接: utcz.com/qa/407995.html

回到顶部