diff --git a/internal/convert/converter.go b/internal/convert/converter.go index 9a9125c2..7139ef56 100644 --- a/internal/convert/converter.go +++ b/internal/convert/converter.go @@ -553,22 +553,27 @@ func (c Converter) convertStruct(name string, fromVal, toVal reflect.Value) erro } func (c Converter) convertInterface(name string, fromVal, toVal reflect.Value) error { - switch fromVal.Kind() { - case reflect.Map: - if fromVal.IsNil() { - toVal.SetZero() + if fromVal.IsZero() { + toVal.SetZero() - return nil - } + return nil + } + // Copy the value from map and slice to avoid the original value being modified. + switch fromVal.Kind() { + case reflect.Map: toVal.Set(reflect.MakeMapWithSize(fromVal.Type(), fromVal.Len())) return c.convertMap(name, fromVal, toVal.Elem()) + case reflect.Slice: + newSlice := reflect.MakeSlice(fromVal.Type(), fromVal.Len(), fromVal.Len()) + reflect.Copy(newSlice, fromVal) + toVal.Set(newSlice) default: toVal.Set(fromVal) - - return nil } + + return nil } func pointer(val reflect.Value) reflect.Value { diff --git a/internal/convert/converter_test.go b/internal/convert/converter_test.go index 2ff55583..8442dc20 100644 --- a/internal/convert/converter_test.go +++ b/internal/convert/converter_test.go @@ -961,17 +961,21 @@ func TestConverter(t *testing.T) { //nolint:maintidx Value: "value1", }, "key2": "value2", + "key3": []int{1, 2}, }, to: pointer(struct { Key1 interface{} Key2 interface{} + Key3 interface{} }{}), expected: pointer(struct { Key1 interface{} Key2 interface{} + Key3 interface{} }{ Key1: "value1", Key2: "value2", + Key3: []int{1, 2}, }), }, {