MarkJoyMa 2 年之前
父节点
当前提交
142c46228b
共有 4 个文件被更改,包括 34 次插入2 次删除
  1. 2 1
      core/conf/config.go
  2. 12 0
      core/conf/config_test.go
  3. 8 1
      core/mapping/unmarshaler.go
  4. 12 0
      core/mapping/unmarshaler_test.go

+ 2 - 1
core/conf/config.go

@@ -32,7 +32,8 @@ type fieldInfo struct {
 	mapField *fieldInfo
 }
 
-// FillDefault fills the default values for the given v.
+// FillDefault fills the default values for the given v,
+// and the premise is that the value of v must be guaranteed to be empty
 func FillDefault(v any) error {
 	return fillDefaultUnmarshaler.Unmarshal(map[string]any{}, v)
 }

+ 12 - 0
core/conf/config_test.go

@@ -1078,4 +1078,16 @@ func TestFillDefaultUnmarshal(t *testing.T) {
 		assert.Equal(t, st.A, "a")
 		assert.Equal(t, st.C, "c")
 	})
+
+	t.Run("has vaue", func(t *testing.T) {
+		type St struct {
+			A string `json:",default=a"`
+			B string
+		}
+		var st = St{
+			A: "b",
+		}
+		err := FillDefault(&st)
+		assert.Error(t, err)
+	})
 }

+ 8 - 1
core/mapping/unmarshaler.go

@@ -711,7 +711,14 @@ func (u *Unmarshaler) processNamedField(field reflect.StructField, value reflect
 
 	valuer := createValuer(m, opts)
 	mapValue, hasValue := getValue(valuer, canonicalKey)
-	if !hasValue || u.opts.fillDefault {
+
+	// When fillDefault is used, m is a null value, hasValue must be false, all priority judgments fillDefault,
+	if u.opts.fillDefault {
+		if !value.IsZero() {
+			return fmt.Errorf("set the default value, %s must be zero", fullName)
+		}
+		return u.processNamedFieldWithoutValue(field.Type, value, opts, fullName)
+	} else if !hasValue {
 		return u.processNamedFieldWithoutValue(field.Type, value, opts, fullName)
 	}
 

+ 12 - 0
core/mapping/unmarshaler_test.go

@@ -4425,4 +4425,16 @@ func TestFillDefaultUnmarshal(t *testing.T) {
 		assert.Equal(t, st.A, "a")
 		assert.Equal(t, st.C, "c")
 	})
+
+	t.Run("has value", func(t *testing.T) {
+		type St struct {
+			A string `json:",default=a"`
+			B string
+		}
+		var st = St{
+			A: "b",
+		}
+		err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st)
+		assert.Error(t, err)
+	})
 }