SuperAPI AI 工具集

num30-config

编程与开发

查看项目

更新于 10-15 11:02

技能介绍

用途

本技能提供 num30/config(github.com/num30/config)的完整知识。这是一个 Go 语言的声明式配置库,能够通过一次调用,从 YAML/JSON/TOML 文件、环境变量和命令行标志中读取配置,填充到 Go 结构体中。适用于用户提到 num30/config、需要编写或调试配置结构体代码的场景。

主要能力

配置来源与优先级

值按以下顺序合并(优先级高者胜出):

  1. 命令行标志(--host=localhost)
  2. 环境变量(HOST=localhost)
  3. 配置文件(myapp.yaml)
  4. 结构体 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 等内置配置结构体快速接入的场景。

限制

具体支持的配置文件格式所列之外未提供;其余平台、收费、价格、效果等信息暂未提供。