Documentation
¶
Overview ¶
Package reflectx 提供反射层的共享原语(全矩阵单源)。
目前承载的是**深拷贝原语**:同一份「reflect.Value 递归深拷贝 + 指针环防护」 实现曾在 oekit/core/config(merge.go deepCopyValue,core#102 修过指针环 栈溢出)与 pkg/pagination(snapshot.go,core#130 pkg 侧)平行维护——两边 语义各自演化(core 侧 struct 拷贝保留未导出字段、pkg 侧含未导出字段的 struct 整块 memcpy 连导出引用字段一起共享)。本包把两者收敛为唯一实现:
- core/config(core#130)与 pkg/pagination 均改引 DeepCopyValue;
- struct 走「整块值拷贝保未导出字段 + 可 Set 的引用型字段逐一递归替换」 的**强**语义(见 DeepCopyValue),两边取齐后引用隔离只紧不松。
指针环安全(core#102 的知识,随实现单源):visited 按**指针身份**记忆已 拷贝节点、先注册再下探,环上第二次访问直接返回已拷贝节点;环内结构共享 关系原样保留(src 里两个指针指向同一块,拷贝后仍指向同一块)。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DeepCopy ¶
func DeepCopy[T any](v T) T
DeepCopy 是 DeepCopyValue 的泛型糖:按 T 的静态反射视图深拷贝 v (nil 接口也拿得到类型),返回独立副本。
func DeepCopyValue ¶
DeepCopyValue 递归深拷贝 v 的引用结构(map/slice/array/pointer/interface/ struct),返回与 v 同类型的独立副本。
各类型的走法:
- map/slice/array:逐 key/元素递归后重建;
- pointer:新建目标并递归下探;**visited 按 src 指针身份记忆已拷贝节点** (core#102 的环防护,随本包单源)——环上第二次访问直接返回已拷贝节点, 自引用/互引用结构不再无限递归(无防护时是 fatal error: stack overflow 崩进程,不是可恢复错误);环内/DAG 结构共享关系原样保留;
- interface:解引后拷贝动态值(接口内隐藏的 map/slice 不再别名);
- struct:**先整块值拷贝**(保住未导出字段——reflect 无法 Set 它们, time.Time 等含未导出字段的值类型依赖这一路),再把**可 Set 的引用型 字段逐一替换成深拷贝**(core#84:整体赋值对引用型字段是浅拷贝,改 副本会反向污染源)。含未导出字段的 struct 其未导出字段内部仍可能 共享引用(reflect 无法探入)——这是反射深拷贝的固有边界。
- 其余(数值/字符串/bool/func/chan 等):原值返回(func/chan 共享即拷贝, 二者没有可拷贝的内部引用)。
仅用于低频路径(配置合并、页快照等)——每层反射分配的开销不适合热路径。 调用方持有 reflect.Value 时用本函数;只有具体类型时 DeepCopy 更顺手。
Types ¶
This section is empty.