Go 加载带有不同结构项列表的YAML文件

Go 加载带有不同结构项列表的YAML文件,go,yaml,Go,Yaml,我有一个YAML格式如下: 操作: -类型:一 一键:价值 -类型:两个 twokey:值 福:酒吧 我想把它加载到一个Go结构中。我试着使用它的DecodeHook,但我无法让它工作 这就是我所尝试的: 类型操作结构{ 行动[]行动 } 类型操作接口{ } 类型一结构{ 一键字符串 } 第二类结构{ 双键字符串 Foo字符串 } 风险值行动 func Load(){ ... 配置:=&mapstructure.DecoderConfig{ DecodeHook:func(sourceType

我有一个YAML格式如下:

操作:
-类型:一
一键:价值
-类型:两个
twokey:值
福:酒吧
我想把它加载到一个Go结构中。我试着使用它的
DecodeHook
,但我无法让它工作

这就是我所尝试的:

类型操作结构{
行动[]行动
}
类型操作接口{
}
类型一结构{
一键字符串
}
第二类结构{
双键字符串
Foo字符串
}
风险值行动
func Load(){
...
配置:=&mapstructure.DecoderConfig{
DecodeHook:func(sourceType,destType reflect.Type,原始接口{})(接口{},错误){
如果fmt.Sprintf(“%s”,destType)=“Action”{
var结果作用
开关原始。(映射[字符串]接口{})[“类型”]{
案例“一”:
结果=一个{}
案例“二”:
结果=两个{}
}
mapstructure.Decode(原始和结果)
返回结果,无
}
归零
},
结果:&行动,
}
...
}
这很难看,也不管用。我得到:

panic: interface conversion: interface {} is map[interface {}]interface {}, not map[string]interface {}
首先是:

如果fmt.Sprintf(“%s”,destType)=“操作”
这很可怕,但这是我让这个角色工作的唯一方法

然后读取列表项,并通过
type
键将其转换到右侧结构。有没有办法让这一切顺利进行


谢谢

最后我采用了这种方法:

config:=&mapstructure.DecoderConfig{
DecodeHook:func(sourceType,destType reflect.Type,原始接口{})(接口{},错误){
var结果作用
如果fmt.Sprintf(“%s”,destType)=“Action”{
rawMap:=raw。(映射[接口{}]接口{})
开关rawMap[“类型”]{
案例“一”:
结果=一个{}
案例“二”:
结果=两个{}
}
mapstructure.Decode(原始和结果)
返回结果,无
}
归零
},
结果:&行动,
}
我只是从围棋开始,所以可能会有更好的方法,但这解决了我遇到的两个问题


更正:如果fmt.Sprintf(“%s”,destType)=“Action”的话,我必须返回到
,因为
反射.TypeOf(result)==nil
看看viper软件包:
它允许您读取toml、json yaml等文件,然后您可以将每个配置值传递给您的结构。

我不太清楚viper如何帮助我处理包含不同类型的列表。。。