我有接受map[string]interface{}
参数的方法(它来自解析的YAML文件):
func load(params map[string]interface{}) error {
}
此方法正在尝试从params
中提取一个元素并将其转换为map[string]interface{}
:
if tmp, has := params["badges"]; has {
if badges, ok := tmp.([]map[string]interface{}); ok {
// ...
} else {
return fmt.Errorf("expected []map[string] but was: %T", tmp)
}
}
当我使用正确的params
(类型为badges
的元素[]map[string]string
运行此方法时,它失败并显示错误:
期望[] map [string],但是是:[] interface {}
但是如果我手动浏览所有项目并一一投放,那就可以了:
lst := tmp.([]interface{})
ifaces := make([]map[interface{}]interface{}, len(lst), len(lst))
for pos, item := range lst {
ifaces[pos] = item.(map[interface{}]interface{})
}
badges := make([]map[string]interface{}, len(lst), len(lst))
for pos, mp := range ifaces {
badges[pos] = make(map[string]interface{})
for k, v := range mp {
badges[pos][k.(string)] = v
}
}
但是第二种解决方案仅将一种类型转换为另一种类型看起来过于复杂。是否可以将interface{}
强制转换为更简单的地图列表?
是否可以将界面{}转换为更简单的地图列表?
不,当然不是。另请参见https://golang.org/doc/faq#convert_slice_of_interface
(特别是因为Go中绝对没有类型转换,您也不能进行类型转换。)