code: func bindMap(params *Params, name string, typ reflect.Type) reflect.Value {
  	var (
  		keyType   = typ.Key()
  		valueType = typ.Elem()
  		resultPtr = reflect.New(reflect.MapOf(keyType, valueType))
  		result    = resultPtr.Elem()
  	)
  	result.Set(reflect.MakeMap(typ))
  	if params.JSON != nil {
  		// Try to inject the response as a json into the created result
  		if err := json.Unmarshal(params.JSON, resultPtr.Interface()); err != nil {
  			binderLog.Warn("bindMap: Unable to unmarshal request", "name", name, "error", err)
  		}
  		return result
  	}
  
  	for paramName := range params.Values {
  		// The paramName string must start with the value in the "name" parameter,
  		// otherwise there is no way the parameter is part of the map
  		if !strings.HasPrefix(paramName, name) {
  			continue
  		}
  
  		suffix := paramName[len(name)+1:]
  		fieldName := nextKey(suffix)
  		if fieldName != "" {
  			fieldName = fieldName[:len(fieldName)-1]
  		}
  		if !strings.HasPrefix(paramName, name+"["+fieldName+"]") {
  			continue
  		}
  
  		result.SetMapIndex(BindValue(fieldName, keyType), Bind(params, name+"["+fieldName+"]", valueType))
  	}
  	return result
  }
docs: // bindMap converts parameters using map syntax into the corresponding map. e.g.:
  //   params["a[5]"]=foo, name="a", typ=map[int]string => map[int]string{5: "foo"}