2026-04-22 01:52:30 +08:00
|
|
|
|
# @go/cast
|
2026-04-22 01:21:12 +08:00
|
|
|
|
|
2026-04-30 22:16:01 +08:00
|
|
|
|
> **Maintainer Statement:** 本项目完全由 AI 维护。任何改动均遵循代码质量与性能的最佳实践。
|
2026-04-22 11:08:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-04-30 22:16:01 +08:00
|
|
|
|
## 🎯 设计哲学
|
2026-04-22 11:08:39 +08:00
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
|
`@go/cast` 是一个为“极致敏捷”设计的 Go 基础工具库。其核心目标是**彻底消除摩擦**:
|
2026-04-22 11:08:39 +08:00
|
|
|
|
|
2026-05-04 11:24:07 +08:00
|
|
|
|
* **万能零摩擦入口**:`To[T]` 作为核心 API,永不返回 `error`。在失败或非法转换时静默返回类型零值。
|
|
|
|
|
|
* **语义化 As 包装**:提供 `As` 函数用于将传统“值+错误”双返回结果一键转化为单值,消除外部库带来的摩擦。
|
|
|
|
|
|
* **智能自动穿透**:`To[T]` 自动识别 JSON 文本、复杂容器映射、指针穿透等场景。
|
2026-05-04 12:15:34 +08:00
|
|
|
|
* **极致性能 JSON**:内置高性能 `fastjson` 引擎,支持 Struct 元数据缓存、`time.Time` 原生处理、零分配 Key 匹配及批量转义优化。
|
2026-04-22 01:52:30 +08:00
|
|
|
|
|
|
|
|
|
|
## 📦 安装
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
go get apigo.cc/go/cast
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 💡 快速开始
|
|
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
|
import "apigo.cc/go/cast"
|
|
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
|
// 1. 万能转换 (To[T] 永不报错,遇错返回零值)
|
|
|
|
|
|
age := cast.To[int]("18") // 18
|
|
|
|
|
|
uid := cast.To[int]("abc") // 0 (静默失败)
|
2026-04-22 01:52:30 +08:00
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
|
// 2. 传统函数消除摩擦 (As 将双返回包装为单值)
|
|
|
|
|
|
b := cast.As(json.Marshal(data)) // 返回 []byte,忽略 error
|
2026-05-04 10:52:15 +08:00
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
|
// 3. 智能 JSON 自动转换
|
2026-05-04 10:41:34 +08:00
|
|
|
|
// 输入 map/struct -> 目标 string: 自动序列化
|
2026-05-04 11:11:37 +08:00
|
|
|
|
js := cast.To[string](map[string]int{"age": 18}) // `{"age":18}`
|
2026-04-30 22:16:01 +08:00
|
|
|
|
|
2026-05-04 10:41:34 +08:00
|
|
|
|
// 输入 string/[]byte -> 目标 struct/map: 自动反序列化
|
2026-05-04 11:11:37 +08:00
|
|
|
|
user := cast.To[User](`{"name":"Tom"}`)
|
2026-04-30 22:16:01 +08:00
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
|
// 4. 复杂容器转换 (Map/Slice)
|
2026-05-04 11:24:07 +08:00
|
|
|
|
m, _ := cast.ToMap[string, int]([]any{"id", "1"})
|
|
|
|
|
|
list, _ := cast.ToSlice[int]([]string{"1", "2", "3"})
|
2026-04-22 01:52:30 +08:00
|
|
|
|
```
|
2026-04-30 22:16:01 +08:00
|
|
|
|
|
|
|
|
|
|
## 🛠 API 指南
|
|
|
|
|
|
|
2026-05-04 11:11:37 +08:00
|
|
|
|
### 核心 API
|
2026-05-04 10:41:34 +08:00
|
|
|
|
|
2026-05-04 11:24:07 +08:00
|
|
|
|
1. **通用转换 (Frictionless)**
|
2026-05-04 11:11:37 +08:00
|
|
|
|
* `To[T any](any) T` —— 万能转换入口。支持基础类型、Slice、Map 以及 JSON 的双向自动转换。失败时返回类型零值。
|
2026-05-04 11:24:07 +08:00
|
|
|
|
* 支持矩阵:
|
|
|
|
|
|
* `string/[]byte` <-> `struct/map/slice` (自动 JSON 编解码)
|
|
|
|
|
|
* `map` <-> `struct` (字段名智能匹配)
|
|
|
|
|
|
* `[]any` <-> `map` (KV 序列展开/折叠)
|
2026-05-04 12:15:34 +08:00
|
|
|
|
* 所有基础类型 (`int`, `string`, `bool`, `float`, `duration`, `time.Time`) 互相转换。
|
2026-05-04 11:24:07 +08:00
|
|
|
|
|
|
|
|
|
|
2. **错误处理工具**
|
2026-05-04 11:11:37 +08:00
|
|
|
|
* `As[T any](v T, err error) T` —— 错误消除工具。将传统的 `(value, error)` 返回值包装为单值。
|
2026-05-04 10:41:34 +08:00
|
|
|
|
|
2026-05-04 11:24:07 +08:00
|
|
|
|
3. **容器转换 (Strict)**
|
|
|
|
|
|
* `ToMap[K, V](any) (map[K]V, error)` —— 构建新 Map。
|
|
|
|
|
|
* `ToSlice[T](any) ([]T, error)` —— 构建新 Slice。
|
2026-05-04 10:41:34 +08:00
|
|
|
|
* `FillMap(target, source)` | `FillSlice(target, source)` —— 填充现有容器。
|
|
|
|
|
|
|
2026-05-04 11:24:07 +08:00
|
|
|
|
4. **JSON 序列化与构建 (Strict)**
|
|
|
|
|
|
* **编码**: `ToJSON(any) (string, error)` | `ToJSONBytes(any) ([]byte, error)`
|
|
|
|
|
|
* **解码**: `UnmarshalJSON(data, target) error` | `FromJSON[T](any) (T, error)`
|
2026-05-04 12:15:34 +08:00
|
|
|
|
* **时间支持**: 原生支持 `time.Time`。支持 Tag 格式定义:`json:"time_field,format=2006-01-02"`。
|
2026-05-04 11:24:07 +08:00
|
|
|
|
* **其他**: `ToJSONDesensitizeBytes(any, []string) ([]byte, error)` | `PrettyToJSON(any) string`
|
2026-05-04 10:41:34 +08:00
|
|
|
|
|
2026-05-04 11:24:07 +08:00
|
|
|
|
5. **泛型工具**
|
2026-05-04 10:41:34 +08:00
|
|
|
|
* `If[T any](bool, T, T) T` —— 三元逻辑。
|
|
|
|
|
|
* `In[T comparable]([]T, T) bool` —— 包含判断。
|
|
|
|
|
|
* `Ptr[T any](T) *T` —— 快速取指针。
|
|
|
|
|
|
* `ArrayToBoolMap[T comparable]([]T) map[T]bool` —— 快速构建索引 Map。
|
2026-04-30 22:16:01 +08:00
|
|
|
|
|
2026-05-04 11:24:07 +08:00
|
|
|
|
6. **基础转换 (直接调用,极致性能)**
|
2026-05-04 11:11:37 +08:00
|
|
|
|
* `Int`, `Int64`, `Uint`, `Uint64`, `Float`, `Float64`, `String`, `Bool`, `Duration`
|
|
|
|
|
|
|
2026-04-30 22:16:01 +08:00
|
|
|
|
## 🧪 验证状态
|
2026-05-04 12:15:34 +08:00
|
|
|
|
测试全部通过,性能达标。
|
|
|
|
|
|
|
|
|
|
|
|
### JSON 性能概览 (v1.3.0)
|
|
|
|
|
|
| 场景 | 耗时 | 内存分配 | 说明 |
|
|
|
|
|
|
| :--- | :--- | :--- | :--- |
|
|
|
|
|
|
| **Struct 序列化** | ~290 ns/op | 96 B/op | 引入元数据缓存,反射开销极低 |
|
|
|
|
|
|
| **Map 序列化** | ~650 ns/op | 152 B/op | 采用 MapRange + 无序化,性能翻倍 |
|
|
|
|
|
|
| **Frictionless 匹配** | ~420 ns/op | 72 B/op | 零分配 Key 比对,GC 压力极小 |
|
|
|
|
|
|
| **字符串转义** | ~170 ns/op | 64 B/op | 批量处理,长文本优势明显 |
|
|
|
|
|
|
|
|
|
|
|
|
详见:[TEST.md](./TEST.md)
|