code: func GetParameter(s string, params interface{}) (interface{}, bool) {
  	if params == nil {
  		return nil, false
  	}
  
  	if paramsValue := reflect.ValueOf(params); paramsValue.Kind() == reflect.Slice {
  		if paramsValueSliceLength := paramsValue.Len(); paramsValueSliceLength > 0 {
  
  			if p := strings.SplitN(s, ".", 2); len(p) > 1 {
  				index, err := strconv.ParseUint(p[0], 10, 64)
  
  				if err != nil || paramsValueSliceLength <= int(index) {
  					return nil, false
  				}
  
  				return GetParameter(p[1], params.([]interface{})[index])
  			}
  
  			index, err := strconv.ParseUint(s, 10, 64)
  
  			if err != nil || paramsValueSliceLength <= int(index) {
  				return nil, false
  			}
  
  			return params.([]interface{})[index], true
  		}
  
  		return nil, false
  	}
  
  	if p := strings.SplitN(s, ".", 2); len(p) > 1 {
  		if paramsValue := reflect.ValueOf(params); paramsValue.Kind() == reflect.Map {
  			if pValue, ok := params.(map[string]interface{})[p[0]]; ok {
  				return GetParameter(p[1], pValue)
  			}
  		} else {
  			return nil, false
  		}
  	} else {
  		if pValue, ok := params.(map[string]interface{})[p[0]]; ok {
  			return pValue, true
  		}
  	}
  
  	return nil, false
  }
docs: // GetParameter extracts interface{} value based on the passed string