Go Can';t将接口{}直接转换为[]映射[字符串]接口{}

Go Can';t将接口{}直接转换为[]映射[字符串]接口{},go,casting,Go,Casting,我有一个接受map[string]接口{}参数的方法(它来自解析的YAML文件): func加载(参数映射[string]接口{})错误{ } 此方法试图从params中提取一个元素,并将其强制转换到map[string]接口{}: 如果tmp有:=参数[“徽章”];有{ 如果是徽章,则ok:=tmp。([]映射[string]接口{});ok{ // ... }否则{ 返回fmt.Errorf(“应为[]映射[string],但为:%T”,tmp) } } 当我使用正确的参数(使用类型为[

我有一个接受
map[string]接口{}
参数的方法(它来自解析的YAML文件):

func加载(参数映射[string]接口{})错误{
}
此方法试图从
params
中提取一个元素,并将其强制转换到
map[string]接口{}

如果tmp有:=参数[“徽章”];有{
如果是徽章,则ok:=tmp。([]映射[string]接口{});ok{
// ...
}否则{
返回fmt.Errorf(“应为[]映射[string],但为:%T”,tmp)
}
}
当我使用正确的
参数
(使用类型为
[]map[string]string
的元素
徽章
)运行此方法时,它会失败并出现错误:

应为[]映射[string],但为:[]接口{}

但如果我手动检查所有项目并逐个进行转换,就可以了:

lst:=tmp.([]接口{})
ifaces:=make([]映射[接口{}]接口{},len(lst),len(lst))
对于pos,项目:=范围lst{
ifaces[pos]=项。(映射[接口{}]接口{})
}
徽章:=make([]映射[字符串]接口{},len(lst),len(lst))
对于pos,mp:=范围ifaces{
徽章[pos]=make(映射[string]接口{})
对于k,v:=范围mp{
徽章[pos][k.(字符串)]=v
}
}
但第二种解决方案看起来过于复杂,只需将一种类型转换为另一种类型。是否可以将
接口{}
转换为映射列表

是否可以将接口{}转换为更简单的映射列表

不,当然不是。另见

(特别是在Go中没有类型转换,您也无法进行类型转换的情况下。)

这个答案可能适用于: