From 70e51bb352b9ac0276fb5739a80825d1f2714c59 Mon Sep 17 00:00:00 2001 From: aimuz Date: Thu, 24 Mar 2022 21:41:38 +0800 Subject: [PATCH] fix: empty slice are set to nil (#1702) support for empty slce, Same behavior as json.Unmarshal --- core/mapping/unmarshaler.go | 6 ++++++ core/mapping/unmarshaler_test.go | 14 ++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index 38703744..780b2420 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -450,6 +450,12 @@ func (u *Unmarshaler) fillSlice(fieldType reflect.Type, value reflect.Value, map refValue := reflect.ValueOf(mapValue) conv := reflect.MakeSlice(reflect.SliceOf(baseType), refValue.Len(), refValue.Cap()) + // support for empty slice + if !refValue.IsNil() && refValue.Len() == 0 { + value.Set(conv) + return nil + } + var valid bool for i := 0; i < refValue.Len(); i++ { ithValue := refValue.Index(i).Interface() diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 767dc0d7..e71adca2 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -330,28 +330,34 @@ func TestUnmarshalFloat(t *testing.T) { func TestUnmarshalInt64Slice(t *testing.T) { var v struct { - Ages []int64 `key:"ages"` + Ages []int64 `key:"ages"` + Slice []int64 `key:"slice"` } m := map[string]interface{}{ - "ages": []int64{1, 2}, + "ages": []int64{1, 2}, + "slice": []interface{}{}, } ast := assert.New(t) ast.Nil(UnmarshalKey(m, &v)) ast.ElementsMatch([]int64{1, 2}, v.Ages) + ast.Equal([]int64{}, v.Slice) } func TestUnmarshalIntSlice(t *testing.T) { var v struct { - Ages []int `key:"ages"` + Ages []int `key:"ages"` + Slice []int `key:"slice"` } m := map[string]interface{}{ - "ages": []int{1, 2}, + "ages": []int{1, 2}, + "slice": []interface{}{}, } ast := assert.New(t) ast.Nil(UnmarshalKey(m, &v)) ast.ElementsMatch([]int{1, 2}, v.Ages) + ast.Equal([]int{}, v.Slice) } func TestUnmarshalString(t *testing.T) {