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中没有类型转换,您也无法进行类型转换的情况下。)这个答案可能适用于: