尝试将Unmarshal
配置hcl
文件转换为结构,使用viper
,返回此错误:1 error(s) decoding:\n\n* 'NATS' expected a map, got 'slice'
。什么不见了?
编码:
func lab() {
var c conf
// config file
viper.SetConfigName("draft")
viper.AddConfigPath(".")
viper.SetConfigType("hcl")
if err := viper.ReadInConfig(); err != nil {
log.Error(err)
return
}
log.Info(viper.Get("NATS")) // gives [map[port:10041 username:cl1 password:__Psw__4433__ http_port:10044]]
if err := viper.Unmarshal(&c); err != nil {
log.Error(err)
return
}
log.Infow("got conf", "conf", c)
}
type conf struct {
NATS struct {
HTTPPort int
Port int
Username string
Password string
}
}
和配置文件(draft.hcl
在当前目录内):
NATS {
HTTPPort = 10044
Port = 10041
Username = "cl1"
Password = "__Psw__4433__"
}
编辑
已经用包检查了这个结构,hcl
它被正确地编组/解组。这也适用于yaml
and viper
。
这两个地方是有区别log.Info(viper.Get("NATS"))
的。当hcl
版本返回一个地图切片时,该yaml
版本返回一个地图:map[password:__psw__4433__ httpport:10044 port:10041 username:cl1]
。