convert/README.md

1.9 KiB
Raw Permalink Blame History

@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