feat: 支持反射设置指针类型字段

- 如果目标字段是指针类型,它会尝试直接赋值(如果类型兼容),或创建一个新指针并递归设置其指向的值。
  - `rfx_example_test.go` 中新增了测试用例,以验证对 `*string` 等指针字段的设置功能。
This commit is contained in:
2025-12-03 10:44:03 +08:00
parent f9e7f8e781
commit cbe079ddcd
3 changed files with 131 additions and 40 deletions

21
rfx.go
View File

@@ -257,6 +257,27 @@ func (r *rfx) setValue(field reflect.Value, v any) bool {
return true
}
// 处理指针类型
if field.Type().Kind() == reflect.Ptr {
// 如果传入的值已经是指针类型,尝试直接赋值
if val.Type().AssignableTo(field.Type()) {
field.Set(val)
return true
}
// 如果传入的值不是指针,创建新指针并设置值
elemType := field.Type().Elem()
newPtr := reflect.New(elemType)
// 递归设置指针指向的值
if !r.setValue(newPtr.Elem(), v) {
return false
}
field.Set(newPtr)
return true
}
// 优先使用 cast 进行智能类型转换
// 这样可以处理 string <-> number, number <-> bool 等常见转换
targetType := field.Type()