Documentation
¶
Overview ¶
Package diff 提供基于 struct diff 标签的结构体字段对比,用于审计日志与变更事件。
约定 ¶
- 参与对比的字段应显式标注 diff:"描述";不参与对比用 diff:"-";未标注字段默认也会对比(可用 Options.OnlyTaggedFields 关闭)。
- Compare / CompareNormalized 要求 before 与 after 为同一类型;CompareE / CompareNormalizedE 在类型不一致时返回 ErrTypeMismatch。
- 切片/数组对 struct(含 *struct)元素:先用 identity 字段匹配同一条元素,再递归比较其余字段。 标量字段可加 diff:"ID,key" 仅作 identity(同 ID 改其它字段会记 in-place diff,而非整行新增/移除); 未标注 key 时退化为「全部带 diff 标签的标量字段拼接」作为 identity。 匹配后的字段路径会带 identity/下标,如 Items[1].Name。
- Map 按 key 对齐后对 value 递归对比,路径形如 Meta[env].Name。
典型用法 ¶
records := diff.CompareNormalized(beforeSpec, afterSpec)
records = diff.AppendRecords(records, diff.MaskedChange("Value", "凭证值", "******", diff.LevelWarn))
Index ¶
- Constants
- Variables
- func NormalizeNilContainers[T any](v T) T
- func Summary(records []DiffRecord) string
- type DiffLevel
- type DiffRecord
- func AppendRecords(records []DiffRecord, extra ...DiffRecord) []DiffRecord
- func Compare(a, b any, opts ...*Options) []DiffRecord
- func CompareE(a, b any, opts ...*Options) ([]DiffRecord, error)
- func CompareNormalized[T any](before, after T, opts ...*Options) []DiffRecord
- func CompareNormalizedE[T any](before, after T, opts ...*Options) ([]DiffRecord, error)
- func MaskedChange(fieldPath, fieldDesc, mask string, level DiffLevel) DiffRecord
- type Options
Constants ¶
View Source
const ( // MarkerAdd 切片/集合新增元素的占位旧值。 MarkerAdd = "新增" // MarkerRemove 切片/集合移除元素的占位新值。 MarkerRemove = "移除" )
Variables ¶
View Source
var ErrTypeMismatch = errors.New("diff: type mismatch")
ErrTypeMismatch 在 CompareE / CompareNormalizedE 中,当 before 与 after 类型不一致时返回。
Functions ¶
func NormalizeNilContainers ¶ added in v2.1.10
func NormalizeNilContainers[T any](v T) T
NormalizeNilContainers 返回 v 的深拷贝,并将 struct 内 nil map/slice 归一化为空容器,避免 diff 误报。
func Summary ¶ added in v2.1.10
func Summary(records []DiffRecord) string
Summary 将多条差异格式化为可读摘要(field: old -> new)。
Types ¶
type DiffRecord ¶
type DiffRecord struct {
FieldPath string // 结构体字段路径(如 "Basic.ID")
FieldDesc string // 字段描述(如 "基础信息.用户ID")
OldValue any
NewValue any
Level DiffLevel
}
func AppendRecords ¶ added in v2.1.10
func AppendRecords(records []DiffRecord, extra ...DiffRecord) []DiffRecord
AppendRecords 追加变更记录。
func Compare ¶
func Compare(a, b any, opts ...*Options) []DiffRecord
Compare 对比两个同类型对象,返回差异列表;类型不一致时 panic。
func CompareE ¶ added in v2.1.10
func CompareE(a, b any, opts ...*Options) ([]DiffRecord, error)
CompareE 与 Compare 相同,但类型不一致时返回 ErrTypeMismatch 而非 panic。
func CompareNormalized ¶ added in v2.1.10
func CompareNormalized[T any](before, after T, opts ...*Options) []DiffRecord
CompareNormalized 在对比前对 before/after 做 nil 容器归一化。
func CompareNormalizedE ¶ added in v2.1.10
func CompareNormalizedE[T any](before, after T, opts ...*Options) ([]DiffRecord, error)
CompareNormalizedE 归一化后对比,类型不一致时返回 ErrTypeMismatch。
func MaskedChange ¶ added in v2.1.10
func MaskedChange(fieldPath, fieldDesc, mask string, level DiffLevel) DiffRecord
MaskedChange 构造脱敏字段变更(如凭证值),old/new 使用同一占位符。
func (*DiffRecord) GetNewValue ¶ added in v2.1.10
func (s *DiffRecord) GetNewValue() string
func (*DiffRecord) GetOldValue ¶ added in v2.1.10
func (s *DiffRecord) GetOldValue() string
Click to show internal directories.
Click to hide internal directories.