gonfig仅支持JSON文件和环境变量两种来源,不支持YAML、INI、TOML等其他格式;其核心逻辑是加载JSON到map[string]interface{}后用同名环境变量覆盖,无嵌套解析、无类型转换、无默认值fallback。

gonfig 能读哪些格式?只支持 JSON 和环境变量
gonfig 不是通用型配置库,它只处理 JSON 文件和 os.Getenv 环境变量两种来源,不支持 YAML、INI、TOML 或远程配置。如果你的配置文件是 config.yaml,直接用 gonfig 会 panic —— 它压根不会尝试解析。
它的核心逻辑是:先加载 JSON 文件到一个 map[string]interface{},再用环境变量逐个覆盖同名 key(字符串键名完全匹配,区分大小写)。没有路径嵌套解析,没有类型自动转换,也没有默认值 fallback。
- 支持的 JSON 结构必须是扁平的
key: value对,嵌套对象(如{"db": {"host": "127.0.0.1"}})会被当作db字符串整体保留,无法通过cfg.GetString("db.host")访问 - 环境变量名需与 JSON 中的 key 完全一致,比如 JSON 里是
"port",就得设PORT=8080(注意 gonfig 不做snake_case到camelCase的映射) - 不校验字段类型:JSON 里
"timeout": 30是 int,但cfg.GetString("timeout")会返回空字符串,得用cfg.GetInt("timeout")
初始化 gonfig 实例时必须显式传入 JSON 路径
gonfig 没有自动搜索机制,gonfig.Load() 不接受空参数,也不会按惯例查 ./config.json 或 $HOME/.app/config.json。你必须自己确认路径存在且可读,并传进去。
常见错误是直接写 gonfig.Load() 导致 panic:"open config.json: no such file or directory" —— 它连当前目录都不默认尝试。
立即学习“go语言免费学习笔记(深入)”;
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 正确写法:
cfg, err := gonfig.Load("./config.json") - 如果 JSON 在
/etc/myapp/settings.json,就写死这个路径,别指望它“智能发现” - 路径中若含变量(如
$HOME),gonfig 不展开,得自己用os.ExpandEnv处理 - 没有
SetConfigName或AddConfigPath这类 API,所有路径控制都在调用方
环境变量覆盖只在 Load 阶段生效,运行时修改无效
gonfig 在 Load() 内部一次性合并 JSON 和当时可见的环境变量,之后再改 os.Setenv 或重启 shell,已加载的 cfg 实例不会更新。它不是监听器,也不提供 Watch() 方法。
这意味着:容器场景下如果用 env_file 注入变量,必须确保这些变量在 gonfig.Load() 执行前已注入进程环境;Kubernetes ConfigMap 挂载后改环境变量,对已启动的 gonfig 实例毫无影响。
- 测试时临时改环境变量,记得在
go run前加前缀,比如:PORT=9000 go run main.go - 不能靠
cfg.Reload()—— gonfig 根本没这个方法 - 想实现热重载?得自己监听文件变化 + 重新调用
gonfig.Load()+ 替换全局 cfg 实例,gonfig 不提供原子切换支持
类型取值必须严格匹配,否则返回零值
gonfig 的 GetString、GetInt 等方法不做类型推导或转换。JSON 里存的是字符串 "30",调 GetInt("timeout") 就返回 0;存的是数字 30,调 GetString("timeout") 就返回空字符串。它不尝试 strconv.Atoi 或 fmt.Sprintf。
这和 viper 的宽容行为截然不同 —— viper 会尽力把 "30" 当成 int 返回,gonfig 则严格按底层存储类型返回。
- 安全做法:先用
cfg.Exists("key")确认 key 存在,再根据 JSON 原始类型选对应 Get 方法 - 没有
GetFloat64或GetBool,只有GetString/GetInt/GetFloat32/GetBool四种,且全部要求原始类型匹配 - 如果 JSON 字段是
null,所有 Get 方法都返回该类型的零值(""、0、false),不报错也不提示

















