完善数据类型转换
This commit is contained in:
@@ -31,15 +31,20 @@ var (
|
||||
reflect.Slice: convertSlice,
|
||||
reflect.Array: convertArray,
|
||||
reflect.Map: convertMap,
|
||||
reflect.Interface: convertInterface,
|
||||
}
|
||||
)
|
||||
|
||||
// 转换为字符串
|
||||
func convertToString(item interface{}) string {
|
||||
if str, ok := item.(string); ok {
|
||||
return str
|
||||
switch v := item.(type) {
|
||||
case string:
|
||||
return v
|
||||
case json.Number:
|
||||
return string(v)
|
||||
default:
|
||||
return fmt.Sprintf("%v", item)
|
||||
}
|
||||
return fmt.Sprintf("%v", item)
|
||||
}
|
||||
|
||||
// 转换为数字(float64)
|
||||
@@ -47,10 +52,28 @@ func convertToFloat64(item interface{}) (float64, error) {
|
||||
switch v := item.(type) {
|
||||
case float64:
|
||||
return v, nil
|
||||
case int, int32, int64:
|
||||
return float64(reflect.ValueOf(v).Int()), nil
|
||||
case uint, uint32, uint64:
|
||||
return float64(reflect.ValueOf(v).Uint()), nil
|
||||
case json.Number:
|
||||
return v.Float64()
|
||||
case int:
|
||||
return float64(v), nil
|
||||
case int8:
|
||||
return float64(v), nil
|
||||
case int16:
|
||||
return float64(v), nil
|
||||
case int32:
|
||||
return float64(v), nil
|
||||
case int64:
|
||||
return float64(v), nil
|
||||
case uint:
|
||||
return float64(v), nil
|
||||
case uint8:
|
||||
return float64(v), nil
|
||||
case uint16:
|
||||
return float64(v), nil
|
||||
case uint32:
|
||||
return float64(v), nil
|
||||
case uint64:
|
||||
return float64(v), nil
|
||||
case float32:
|
||||
return float64(v), nil
|
||||
default:
|
||||
@@ -125,25 +148,40 @@ func convertString(field reflect.Value, value string) (interface{}, error) {
|
||||
}
|
||||
|
||||
func convertSlice(field reflect.Value, value string) (interface{}, error) {
|
||||
var result []interface{}
|
||||
if err := json.Unmarshal([]byte(value), &result); err != nil {
|
||||
sliceType := field.Type()
|
||||
result := reflect.New(sliceType).Elem()
|
||||
if err := json.Unmarshal([]byte(value), result.Addr().Interface()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
return result.Interface(), nil
|
||||
}
|
||||
|
||||
func convertArray(field reflect.Value, value string) (interface{}, error) {
|
||||
var result []interface{}
|
||||
arrayType := field.Type()
|
||||
result := reflect.New(arrayType).Elem()
|
||||
if err := json.Unmarshal([]byte(value), result.Addr().Interface()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result.Interface(), nil
|
||||
}
|
||||
|
||||
func convertMap(field reflect.Value, value string) (interface{}, error) {
|
||||
mapType := field.Type()
|
||||
result := reflect.New(mapType).Elem()
|
||||
if err := json.Unmarshal([]byte(value), result.Addr().Interface()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result.Interface(), nil
|
||||
}
|
||||
|
||||
func convertInterface(field reflect.Value, value string) (interface{}, error) {
|
||||
var result interface{}
|
||||
if err := json.Unmarshal([]byte(value), &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func convertMap(field reflect.Value, value string) (interface{}, error) {
|
||||
return nil, fmt.Errorf("map转换未实现")
|
||||
}
|
||||
|
||||
func getBaseTypeFromAlias(aliasType reflect.Type) reflect.Type {
|
||||
if aliasType.Kind() == reflect.Ptr {
|
||||
aliasType = aliasType.Elem()
|
||||
|
||||
Reference in New Issue
Block a user