必须在main()最开头调用godotenv.Load(),否则因os.Environ()快照机制及第三方库init阶段提前读取而失效;默认不覆盖已存在变量,需WithReplace或Overload;值均为字符串,需手动类型转换。
Go 里不能直接用文件,必须靠第三方库加载;是最常用的选择,但它默认不覆盖已存在的环境变量,这点常被忽略。
为什么
看似执行了却没生效
常见错误是调用
太晚——比如在
函数末尾,或在其他包已经读取过
之后才加载。Go 的
是进程启动时快照,后续修改环境变量只影响新起的子进程,不影响当前运行中已缓存值的逻辑(比如某些库在 init 阶段就提前读了)。
务必在
最开头、任何业务逻辑前调用
如果用
,确保
文件和当前工作目录一致;否则传绝对路径:
它默认跳过已设置的环境变量(安全策略),如需强制覆盖,加
或传
和
的关系
底层就是反复调用
,但它只设键值对,不做类型转换(所有值都是字符串)。如果你的配置需要整数或布尔值,得自己转:
别指望
解析
成 int;它只负责把文件内容“搬进”
。
立即学习
“
go语言免费学习笔记(深入)
”;
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
它不支持嵌套语法(如
),除非你手动启用
它不读取 shell 的
行,只认
格式(空格前后自动 trim)
注释行以
开头,但不能跟在值后面:
会被当作文本值,不是注释
多个环境文件怎么加载(dev/staging/prod)
Go 没有内置环境切换机制,
本身也不识别
这类变量。你要自己组合文件名:
注意加载顺序:后加载的会覆盖前面同名 key(前提是用了
选项)。
推荐按
→
→
顺序加载,本地覆盖通用,环境特例再覆盖本地
应该加进
,避免误提交敏感值
不要在代码里写死
,否则本地调试容易漏掉配置
真正麻烦的不是加载,而是「谁在什么时候读了哪条环境变量」——尤其当你引入了数据库驱动、HTTP 客户端、日志库等第三方包,它们可能在 init 阶段就初始化了连接池或 logger 实例。这时候哪怕
加载成功,也救不回已经被缓存的旧值。
.envgodotenvgodotenv.Load()godotenv.Load()main()os.Getenv()os.Environ()main()godotenv.Load()go run main.go.envgodotenv.Load("/path/to/.env")godotenv.Overload()godotenv.LoadWithOptions(godotenv.WithoutSourceLookup(), godotenv.WithReplace())godotenvos.Setenvgodotenv.Load()os.Setenv(key, value)portStr := os.Getenv("PORT")
port, _ := strconv.Atoi(portStr) // 注意错误处理godotenvPORT=3000os.Environ()DB_URL=${PROTOCOL}://${HOST}godotenv.WithExpand()exportKEY=VALUE#PORT=3000 # commentgodotenvNODE_ENVenv := os.Getenv("ENVIRONMENT")
if env == "" {
env = "development"
}
godotenv.Load(".env", ".env."+env)WithReplace.env.env.local.env.$ENV.env.local.gitignoregodotenv.Load(".env.production")godotenv