51 lines
2.3 KiB
Markdown
51 lines
2.3 KiB
Markdown
# @go/cast
|
||
|
||
`@go/cast` 是一个为“敏捷开发”设计的 Go 基础工具库。它的设计初衷是打破 Go 语言严苛类型系统带来的繁琐摩擦,让开发者在处理数据转换时能够拥有类似 **JavaScript** 或 **PHP** 的丝滑体验。
|
||
|
||
## 🎯 设计哲学
|
||
|
||
* **弱化类型摩擦**:在业务逻辑中,我们不应该被 `if err != nil` 的类型转换填满。`cast` 倾向于返回“合理的默认值”而不是错误,让你专注于核心业务流。
|
||
* **补足语言短板**:Go 缺失了像三元运算符 (`a ? b : c`) 这样简洁的语法。`cast` 通过泛型工具类(`If`, `Switch`, `In`)将其补回。
|
||
* **去标签化 (No JSON Tags)**:我们不希望在每一个 Struct 字段后都手动写上 `` `json:"name"` ``。`cast` 的序列化工具能自动处理 Go 的大写导出规则,将其转换为更符合接口惯例的小写 Key。
|
||
* **数据直觉**:序列化应该保持数据的本色。我们默认禁用了 HTML 转义,确保像 `<a>` 这样的符号在传输中不会被强制转义为 `\u003c`。
|
||
|
||
## 🚀 核心特性
|
||
|
||
* **强制转换**:`Int()`, `String()`, `Bool()`, `Float()` 等函数支持多种原始类型及其指针的平滑转换。
|
||
* **泛型工具**:
|
||
* `If(cond, a, b)`:类型安全的三元运算符替代品。
|
||
* `In(slice, target)`:一行代码判断包含关系。
|
||
* `Switch(index, ...args)`:基于索引的快速分支选择。
|
||
* **现代化 JSON**:
|
||
* `Json()` / `JsonP()`:默认不转义 HTML 字符。
|
||
* `FixedJson()`:自动将 Struct 字段首字母改为小写,无需维护 JSON Tag。
|
||
* **指针辅助**:`StringPtr()`, `IntPtr()` 等函数简化了字面量赋值给指针字段的痛苦。
|
||
|
||
## 📦 安装
|
||
|
||
```bash
|
||
go get apigo.cc/go/cast
|
||
```
|
||
|
||
## 💡 快速开始
|
||
|
||
```go
|
||
import "apigo.cc/go/cast"
|
||
|
||
// 1. 像 JS 一样转换
|
||
age := cast.Int("18") // 18
|
||
name := cast.String(123) // "123"
|
||
|
||
// 2. 泛型三元运算
|
||
status := cast.If(isAdmin, "Admin", "User") // 类型自动推导
|
||
|
||
// 3. 自动首字母小写的 JSON (无需 Tag)
|
||
type User struct { Name string }
|
||
u := User{Name: "Tom"}
|
||
js := cast.FixedJson(u) // {"name":"Tom"}
|
||
|
||
// 4. 特殊字符不转义
|
||
content := map[string]string{"link": "<a>"}
|
||
fmt.Println(cast.Json(content)) // {"link":"<a>"} 而不是 \u003c
|
||
```
|