I have method which accepts map[string]interface{}
parameters (it comes from parsed YAML file):
func load(params map[string]interface{}) error {
}
This method is trying to extract one element from params
and cast it to 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)
}
}
When I run this method with correct params
(with element badges
of type []map[string]string
) it fails with error:
expected []map[string] but was: []interface {}
But if I go through all items manually and cast them one by one, it will be OK:
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
}
}
But the second solution looks overcomplicated for just casting one type to another. Is it possible to cast interface{}
to list of maps simpler?