用途
本技能提供 num30/config(github.com/num30/config)的完整知识。这是一个 Go 语言的声明式配置库,能够通过一次调用,从 YAML/JSON/TOML 文件、环境变量和命令行标志中读取配置,填充到 Go 结构体中。适用于用户提到 num30/config、需要编写或调试配置结构体代码的场景。
主要能力
配置来源与优先级
值按以下顺序合并(优先级高者胜出):
- 命令行标志(--host=localhost)
- 环境变量(HOST=localhost)
- 配置文件(myapp.yaml)
- 结构体 tag 默认值(default:"localhost")
结构体 Tag 支持
| Tag | 用途 | 示例 |
|---|---|---|
| default:"val" | 默认值 | default:"localhost" |
| validate:"rule" | 校验规则(go-playground/validator) | validate:"required" |
| flag:"name" | 覆盖 CLI 标志名 | flag:"debug" |
| envvar:"NAME" | 覆盖环境变量名 | envvar:"DB_PASS" |
| usage:"text" | 标志用法/帮助文本 | usage:"enable debug logging" |
| mapstructure:",squash" | 将内嵌结构体字段平铺到父级 | 见下文 |
ConfReader 构建器 API
config.NewConfReader("myapp") 创建读取器(配置名同时作为文件名与环境变量前缀基础);.WithSearchDirs("/etc/conf", "./") 覆盖配置文件搜索目录(默认:主目录与当前目录);.WithPrefix("MYAPP") 设置环境变量前缀,如 MYAPP_DB_HOST;.Read(&cfg) 读取并填充结构体,返回 error。
热更新监听
reader := config.NewConfReader("myapp"); err := reader.Read(&cfg); mutex := reader.Watch()(必须在 Read 之后调用,否则 panic)。线程安全访问:mutex.RLock(); val := cfg.SomeField; mutex.RUnlock()。
使用方式
安装:go get github.com/num30/config
最小示例:
type Config struct {
Host string default:"localhost" validate:"required"
Port int default:"8080"
}
func main() { var cfg Config err := config.NewConfReader("myapp").Read(&cfg) if err != nil { panic(err) } }
配置文件
文件名:<configName>.yaml(或 .json、.toml、.hcl、.ini、.env、.properties)。搜索顺序:主目录,然后是当前目录(可通过 WithSearchDirs 覆盖)。字段名映射:camelCase → lower camelCase 的 YAML 键,例如结构体字段 DB.DbName 对应 db.dbName。
环境变量
默认模式:字段路径中的点替换为下划线并转为大写,例如 App.Server.Port → APP_SERVER_PORT;带前缀时成为 MYAPP_APP_SERVER_PORT。可用 envvar tag 覆盖,如 Password string envvar:"DB_PASS" 从 DB_PASS 读取。
命令行标志
默认模式:小写点路径加 -- 前缀,如 App.Server.Port → --app.server.port=8080。布尔标志可单独传入(无需值):--verbose。可用 flag tag 覆盖。切片重复传参:--slice a --slice b。字节切片使用 base64 编码:--bytes dGVzdA==。
Squash 内嵌
在嵌入结构体上使用 mapstructure:",squash" 可将其字段平铺到父级:配置文件写 verbose: true 而非 globalConfig.verbose: true;环境变量写 VERBOSE=true。
支持的 Go 类型
bool、int/int8/int16/int32/int64、uint/uint8/uint16/uint32/uint64、float32/float64、string、[]string、[]byte(flags/env 中为 base64)、time.Duration。
校验
使用 go-playground/validator 的 tag,例如 validate:"required"、validate:"min=1,max=65535"、validate:"required,email"。违反约束时 Read() 返回校验错误。
内置结构体(lib 包)
import "github.com/num30/config/lib";lib.PostgresqlDb 提供 Host、Password、DbName、Username、Port、SslEnabled 及合理默认值(Host:"localhost", Password:"pass", Username:"postgres", Port:5432, SslEnabled:false),可用 GetConnString() 获取连接串。
切片来源格式
环境变量:SLICE=a,b,c;配置文件:slice: ["a", "b", "c"];CLI:--slice a --slice b。
错误处理
Read() 会在以下情况返回错误:配置结构体为 nil 或非指针、配置文件解析失败("failed to unmarshal struct")、默认值设置失败("failed to set default values")、校验失败("validation error: Key: '...' Error:...")。Watch() 在 Read() 之前调用会 panic。
适用场景
需要在 Go 项目中统一管理配置文件、环境变量和命令行参数来源的配置加载;需要默认值、字段校验、配置热更新;以及使用 PostgreSQL 等内置配置结构体快速接入的场景。
限制
具体支持的配置文件格式所列之外未提供;其余平台、收费、价格、效果等信息暂未提供。