默认敏感,[Database]与[database]被视为不同section;需显式启用Insensitive:true才忽略大小写,且InsensitiveKeys:true才对key生效;DEFAULT section为隐式存在,裸键归入其中,Section("")无效。

用 gopkg.in/ini.v1 读取 ini 文件时,section 名大小写敏感吗?
默认敏感。ini 库把 [Database] 和 [database] 当成两个不同 section,读不到值就返回零值,不报错,容易误以为配置加载失败。
- 加
ini.LoadOptions{Insensitive: true}才能忽略大小写 - 如果配置项名(key)也要忽略大小写,还得额外设
InsensitiveKeys: true - 注意:
Insensitive只影响 section 和 key 的匹配逻辑,不影响实际存储的键名——后续用cfg.Section("db").Key("host")查时,仍要按原始大小写写字符串
YAML 解析选 gopkg.in/yaml.v3 还是 github.com/go-yaml/yaml?
用 gopkg.in/yaml.v3。它是官方维护分支,v2/v3 兼容性稳定;而 github.com/go-yaml/yaml 是旧版别名,v3 后已重定向,直接引用易导致模块版本混乱。
- 结构体字段必须导出(首字母大写),且加
yaml:"key_name"tag 显式绑定 - 嵌套 map 或 slice 时,空字段默认被忽略;需用
omitempty控制序列化,但反序列化时它没影响 - 如果 YAML 里有注释或锚点(anchor),
v3默认不解析——这不是 bug,是设计取舍,别指望它当编辑器用
os.Getenv 和配置文件哪个优先级更高?
Go 本身不定义优先级,得你自己控制。常见做法是「环境变量覆盖配置文件」,因为部署时更灵活。
- 先加载文件,再用
os.Getenv检查同名环境变量,存在就覆盖对应字段 - 别用
os.Setenv去“预设”环境变量——它只对子进程有效,当前进程读不到 - 注意类型转换:环境变量全是字符串,
strconv.Atoi失败会 panic,务必检查 err
为什么 ini.File.Section("").Key("xxx") 总是空?
因为 ini 库默认把无 section 的键归到 DEFAULT section,不是全局根。你写的 [DEFAULT] 是显式 section,但没写 section 的键会被自动塞进去,而 Section("") 查的是空字符串命名的 section,根本不存在。
立即学习“go语言免费学习笔记(深入)”;
- 正确写法是
cfg.Section("DEFAULT").Key("xxx")或更稳妥地用cfg.Key("xxx")(它内部会 fallback 到 DEFAULT) - 如果配置文件开头没写
[DEFAULT],但有裸键,库仍会创建隐式 DEFAULT section——这点文档没说清,容易踩空 - 想禁用 DEFAULT 行为?不行。这是 ini 规范的一部分,库不会提供开关










