diff --git a/convert.go b/convert.go index bd6523e..6c0c3b6 100644 --- a/convert.go +++ b/convert.go @@ -177,6 +177,9 @@ func (ce *ConverterEngine) Convert(source interface{}, targetType reflect.Type) if ok { return kind2Exact(stringer.String(), targetType), nil } + if sourceType == nil { + return kind2Exact("", targetType), nil + } // Convert to string typical value types switch sourceType.Kind() { case reflect.Bool: @@ -191,6 +194,20 @@ func (ce *ConverterEngine) Convert(source interface{}, targetType reflect.Type) } + if sourceType == nil { + switch targetType.Kind() { + case reflect.String: + return kind2Exact("", targetType), nil + case reflect.Bool: + return kind2Exact(false, targetType), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return kind2Exact(0, targetType), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return kind2Exact(0, targetType), nil + case reflect.Float32, reflect.Float64: + return kind2Exact(0.0, targetType), nil + } + } if sourceType.Kind() == reflect.String { // Attempt to parse typical value types from the string switch targetType.Kind() { diff --git a/convert_test.go b/convert_test.go index 82ad32f..9de829e 100644 --- a/convert_test.go +++ b/convert_test.go @@ -105,19 +105,34 @@ var testData = []ConversionTest{ "uno": 1, "dos": 2, "tres": 3, + "nil": nil, }, map[string]int{ "uno": 1, "dos": 2, "tres": 3, + "nil": 0, }, nil}, {map[string]interface{}{ "1": "uno", "2": "dos", "3": "tres", + "4": nil, }, map[int]string{ 1: "uno", 2: "dos", 3: "tres", + 4: "", + }, nil}, + {map[string]interface{}{ + "uno": 1, + "dos": 2, + "tres": 3, + "nil": nil, + }, map[string]int{ + "uno": 1, + "dos": 2, + "tres": 3, + "nil": 0, }, nil}, {[]byte{65, 66, 67, 0}, "ABC\x00", nil}, {"ABC\x00", []byte{65, 66, 67, 0}, nil},