Explorar o código

fix: empty slice are set to nil (#1702)

support for empty slce, Same behavior as json.Unmarshal
aimuz %!s(int64=3) %!d(string=hai) anos
pai
achega
70e51bb352
Modificáronse 2 ficheiros con 16 adicións e 4 borrados
  1. 6 0
      core/mapping/unmarshaler.go
  2. 10 4
      core/mapping/unmarshaler_test.go

+ 6 - 0
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()

+ 10 - 4
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) {