fix: incorrect unmarshal behavior for pointer primitives

This commit is contained in:
yusing
2025-05-14 12:20:52 +08:00
parent 7435b8e485
commit 8e27886235
2 changed files with 74 additions and 5 deletions

View File

@@ -314,12 +314,26 @@ func Convert(src reflect.Value, dst reflect.Value, checkValidateTag bool) gperr.
return gperr.Errorf("convert: dst is %w", ErrNilValue)
}
if !src.IsValid() || src.IsZero() {
if dst.CanSet() {
dst.Set(reflect.Zero(dst.Type()))
return nil
if (src.Kind() == reflect.Pointer && src.IsNil()) || !src.IsValid() {
if !dst.CanSet() {
return gperr.Errorf("convert: src is %w", ErrNilValue)
}
return gperr.Errorf("convert: src is %w", ErrNilValue)
// manually set nil
dst.Set(reflect.Zero(dst.Type()))
return nil
}
if src.IsZero() {
if !dst.CanSet() {
return gperr.Errorf("convert: src is %w", ErrNilValue)
}
switch dst.Kind() {
case reflect.Pointer, reflect.Interface:
dst.Set(reflect.New(dst.Type().Elem()))
default:
dst.Set(reflect.Zero(dst.Type()))
}
return nil
}
srcT := src.Type()