config/README.md

62 lines
2.2 KiB
Markdown
Raw Normal View History

# @go/config
2026-05-01 21:25:11 +08:00
> **Maintainer Statement:** 本项目完全由 AI 维护。任何改动均遵循代码质量与性能的最佳实践。
## 🎯 设计哲学
`@go/config` 旨在为应用提供一种**零配置感**的配置加载体验。其核心目标是:
* **零摩擦入口**`To[T]` 支持一键加载配置对象;`Load` 支持注入式加载。
* **多源融合**:自动合并基础配置、环境特定配置(`env.json/yaml`)以及系统环境变量。
* **语义映射**:通过下划线分隔的环境变量(如 `DB_HOST`)自动智能穿透映射到结构体嵌套字段(`{"db":{"host":...}}`)。
* **极致敏捷**:支持 JSON/YAML 格式,并内置 `Duration` 等增强类型,解决原生 Go 在配置解析中的痛点。
## 📦 安装
```bash
go get apigo.cc/go/config
```
## 💡 快速开始
```go
import "apigo.cc/go/config"
type MyConfig struct {
Port int
DB struct {
Host string
}
}
// 1. 万能加载 (To 一键获取配置对象)
conf := config.To[MyConfig]("app") // 加载 app.json 或 app.yml
// 2. 传统注入 (Load 注入到现有指针)
var settings MyConfig
config.Load(&settings, "app")
```
## 🛠 API 指南
### 核心 API
1. **通用加载 (Frictionless)**
* `To[T any](name string) T` —— 万能加载入口。自动在当前目录、执行文件目录及用户主目录搜索 `name.json/yml`。失败时返回类型零值。
* `Load(target any, name string) error` —— 注入加载。将配置内容注入到 `target` 指针。
2. **加载机制与优先级**
* **基础文件**: 搜索并加载 `name.json``name.yml`
* **环境补充**: 若存在 `env.json``env.yml`,则加载并覆盖基础文件内容。
* **环境变量覆盖**: 自动扫描系统环境变量,按 `_` 分隔符映射到结构体字段(不区分大小写)。
* 示例: `APP_PORT=8080` -> `{"app": {"port": 8080}}`
3. **增强类型**
* `Duration` —— 支持字符串解析的 `time.Duration` 包装类(如 `"5s"`, `"1h"`),解决标准库 `time.Duration` 在 JSON/YAML 反序列化中的限制。
## 🧪 验证状态
测试全部通过,支持复杂嵌套结构与环境变量重载。
详见:[TEST.md](./TEST.md)