@go/convert

@go/convert 是一个为“零摩擦”数据映射设计的深度转换库。它的核心哲学是意图优先:通过目标对象的类型推断用户的需求,并尽力抹平输入数据与目标形状之间的鸿沟。

🎯 设计哲学

  • 消除类型摩擦:在业务代码中,我们经常遇到单值与切片、字符串与结构体之间的转换。convert 能够自动处理这些“形状”差异(如将单值包装成切片,或将切片解包为单值)。
  • 极致容忍 Key 名Map 键名可能是 user_id,也可能是 UserIdconvert 在映射时会忽略所有非字母数字字符及大小写,确保映射成功。
  • 指针透明化:无论是 int 映射到 *string,还是 ***int 映射到 intconvert 都会自动处理深层指针的穿透与分配。
  • 可定制转换:支持 ParseXxx 方法作为转换钩子,允许对象在被映射时执行特定的解析逻辑。

🚀 核心特性

  • 深度映射:支持 Struct、Map、Slice 之间的无限层级嵌套转换。
  • 智能切片转换
    • 单值 -> 切片:自动包装为 []T{val}
    • 切片 -> 单值:自动取首个元素。
    • CSV 字符串 -> 切片:支持 "1,2,3" 风格的自动拆分。
  • 函数转换:支持将一个函数转换为另一个签名的函数,并在调用时自动转换参数和返回值。
  • 接口支持:兼容 json.Unmarshaleryaml.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"
Description
基于反射的深度对象映射与 Struct/Map 转换
Readme MIT 48 KiB
Languages
Go 100%