2.0 KiB
2.0 KiB
关于本项目
本项目完全由 AI 维护。代码源自 github.com/ssgo/u 的重构。
@go/convert
@go/convert 是一个为“零摩擦”数据映射设计的深度转换库。它的核心哲学是意图优先:通过目标对象的类型推断用户的需求,并尽力抹平输入数据与目标形状之间的鸿沟。
🎯 设计哲学
- 消除类型摩擦:在业务代码中,我们经常遇到单值与切片、字符串与结构体之间的转换。
convert能够自动处理这些“形状”差异。 - 极致容忍 Key 名:忽略所有非字母数字字符及大小写,确保不同来源的数据都能精准映射。
- 指针透明化:自动处理深层指针的穿透与分配。
- 可定制转换:通过方法钩子实现特定的解析逻辑。
🛠 API Reference
核心函数
func To(from, to any)
将 from 中的数据深度映射到 to 中。to 必须是一个指针类型。
- 支持类型:基础类型互转、Struct 互转、Map 转 Struct、Struct 转 Map、Slice 互转等。
- 去摩擦特性:支持单值与切片的互转(包装/解包)、CSV 字符串转切片。
func Convert(from, to any)
To 的别名,用于保持向前兼容。
结构体分析
func FlatStruct(data any) *StructInfo
平展结构体。返回导出字段、导出方法及其对应的 reflect.Value 映射。
func FlatStructWithUnexported(data any) *StructInfo
平展结构体,包含未导出的字段和方法。
定制转换钩子
如果目标结构体定义了 func (p *T) ParseXxx(v any) FieldType 方法(其中 Xxx 为字段名),convert 将优先调用该方法来决定字段的值。
📦 安装
go get apigo.cc/go/convert
💡 快速开始
import "apigo.cc/go/convert"
// 1. 模糊键名匹配
from := map[string]any{"user-id": 1001}
var u struct { UserID int }
convert.To(from, &u) // u.UserID = 1001
// 2. 切片自动解包
nums := []int{100, 200}
var n int
convert.To(nums, &n) // n = 100