func GetMapKeys(val interface{}) ([]string, error) {
	switch v := val.(type) { // let me optimize pre-maturally
	case map[string]interface{}:
	case Map:
		return MapKeys(v), nil
	case map[string]string:
	case StrMap:
		return StrMapKeys(v), nil
	}

	if !IsStringKeyMap(val) {
		return nil, fmt.Errorf("Not a string-keyed map")
	}

	keys := reflect.ValueOf(val).MapKeys()
	ret := make([]string, len(keys))
	for i, key := range keys {
		ret[i] = key.Interface().(string)
	}
	return ret, nil
}
// GetMapKeys return keys only for string-keyed map
GetMapKeys return keys only for string-keyed map
// GetMapKeys return keys only for string - keyed map
func GetMapKeys(val interface{}) ([]string, error) {
	switch v := val.(type) { 
	case map[string]interface{}:
	case Map:
		return MapKeys(v), nil
	case map[string]string:
	case StrMap:
		return StrMapKeys(v), nil
	}
	if !IsStringKeyMap(val) {
		return nil, fmt.Errorf("Not a string-keyed map")
	}
	keys := reflect.ValueOf(val).MapKeys()
	ret := make([]string, len(keys))
	for i, key := range keys {
		ret[i] = key.Interface().(string)
	}
	return ret, nil
}
func GetMapKeys ( val interface { } ) ( [ ] string , error ) { switch v := val . ( type ) { case map [ string ] interface { } : case Map : return MapKeys ( v ) , nil case map [ string ] string : case StrMap : return StrMapKeys ( v ) , nil } if ! IsStringKeyMap ( val ) { return nil , fmt . Errorf ( " " ) } keys := reflect . ValueOf ( val ) . MapKeys ( ) ret := make ( [ ] string , len ( keys ) ) for i , key := range keys { ret [ i ] = key . Interface ( ) . ( string ) } return ret , nil }
GetMapKeys return keys only for string-keyed map
GetMapKeys return keys only for string - keyed map
// let me optimize pre-maturally