fix: New()/Array() 正确处理 Nil 及已经是 R 的元素,不再 panic/重复包装

New(nil) 之前会 panic,现在返回 Nil(新增的 R 空实现单例,所有操作都是
安全的空操作/零值,不用调用方每次都判空)。New([]R{...}) 和 Array() 遇到
元素本身已经是 R(包括 Nil)时直接透传,不再重新拿 reflect.Value 包一层,
避免丢失原有的空值语义或类型信息。
This commit is contained in:
2026-08-20 17:28:57 +08:00
parent 3915bee7b8
commit 1f48635da3
5 changed files with 110 additions and 7 deletions
+8 -1
View File
@@ -518,7 +518,14 @@ func (r *rfx) Array() []R {
result := make([]R, v.Len())
for i := 0; i < v.Len(); i++ {
result[i] = &rfx{value: v.Index(i)}
elem := v.Index(i)
if elem.Kind() == reflect.Interface && !elem.IsNil() {
if r, ok := elem.Interface().(R); ok {
result[i] = r
continue
}
}
result[i] = &rfx{value: elem}
}
return result
}