跳到主要内容

Mold

mold 包是一个结构体变换引擎,基于结构体标签修改字段值。它在字段和结构体两个层级都可以操作。

工作原理

结构体字段上的 mold 标签会触发变换函数。框架在查询结果返回时自动运行 mold 变换器来丰富响应数据。

内置:用户名翻译

最常见的内置用法是将用户 ID 翻译为显示名称:

type User struct {
orm.FullAuditedModel
// CreatedBy string `mold:"translate=user?"` ← 从 FullAuditedModel 继承
// CreatedByName string `bun:",scanonly"` ← 由 mold 填充
}

当查询结果包含 CreatedBy = "user-123" 时,mold 变换器查找用户数据字典并设置 CreatedByName = "Alice"

接口

Transformer

type Transformer interface {
Struct(ctx context.Context, value any) error
Field(ctx context.Context, value any, tags string) error
}

FieldTransformer

实现自定义字段级变换:

type FieldTransformer interface {
Tag() string
Transform(ctx context.Context, fl FieldLevel) error
}

StructTransformer

实现自定义结构体级变换:

type StructTransformer interface {
Transform(ctx context.Context, sl StructLevel) error
}

FieldLevel API

在字段变换器内部,FieldLevel 提供:

方法返回值用途
Transformer()Transformer访问父级变换器
Name()string当前字段名
Parent()reflect.Value父级结构体值
Field()reflect.Value当前字段值
Param()string标签中的参数(如 translate=user? 中的 user?
SiblingField(name)reflect.Value, bool按名称访问同级字段

标签格式

mold:"function=param"

多个变换:

mold:"function1=param1,function2=param2"

数据字典解析

translate 变换器通过数据字典解析字段值:

type DataDictResolver interface {
Resolve(ctx context.Context, dictType string, keys []string) (map[string]string, error)
}

translate=user? 中的 ? 后缀表示翻译是可选的——如果查找失败,保留原始值而不是返回错误。