2.3 KiB
2.3 KiB
@go/convert
@go/convert 是一个为“零摩擦”数据映射设计的深度转换库。它的核心哲学是意图优先:通过目标对象的类型推断用户的需求,并尽力抹平输入数据与目标形状之间的鸿沟。
🎯 设计哲学
- 消除类型摩擦:在业务代码中,我们经常遇到单值与切片、字符串与结构体之间的转换。
convert能够自动处理这些“形状”差异(如将单值包装成切片,或将切片解包为单值)。 - 极致容忍 Key 名:Map 键名可能是
user_id,也可能是UserId。convert在映射时会忽略所有非字母数字字符及大小写,确保映射成功。 - 指针透明化:无论是
int映射到*string,还是***int映射到int,convert都会自动处理深层指针的穿透与分配。 - 可定制转换:支持
ParseXxx方法作为转换钩子,允许对象在被映射时执行特定的解析逻辑。
🚀 核心特性
- 深度映射:支持 Struct、Map、Slice 之间的无限层级嵌套转换。
- 智能切片转换:
- 单值 -> 切片:自动包装为
[]T{val}。 - 切片 -> 单值:自动取首个元素。
- CSV 字符串 -> 切片:支持
"1,2,3"风格的自动拆分。
- 单值 -> 切片:自动包装为
- 函数转换:支持将一个函数转换为另一个签名的函数,并在调用时自动转换参数和返回值。
- 接口支持:兼容
json.Unmarshaler和yaml.Unmarshaler。 - 平展工具:提供
FlatStruct工具,可将复杂的嵌套结构体平展为扁平的字段列表。
📦 安装
go get apigo.cc/go/convert
💡 快速开始
import "apigo.cc/go/convert"
// 1. 极致去摩擦的键名匹配
from := map[string]any{"user_id": 1001, "USER-NAME": "Andy"}
type User struct { UserID int; UserName string }
var u User
convert.To(from, &u) // u.UserID = 1001, u.UserName = "Andy"
// 2. 切片自动解包
nums := []int{100, 200}
var n int
convert.To(nums, &n) // n = 100
// 3. 智能 CSV 解析
tags := "tag1, tag2, tag3"
var tagList []string
convert.To(tags, &tagList) // ["tag1", "tag2", "tag3"]
// 4. 函数动态映射
f1 := func(a int) int { return a + 1 }
var f2 func(string) string
convert.To(f1, &f2)
fmt.Println(f2("10")) // "11"