Go项目需用github.com/joho/godotenv显式加载.env文件,因标准库不支持自动读取;推荐Overload覆盖变量,注意格式规范(等号无空格、值含空格需引号),生产环境禁用.env而应使用平台原生环境注入机制。

Go 项目里不能直接读 .env 文件
Go 标准库不支持自动加载 .env 文件,所有环境变量必须显式读取或由第三方库解析。如果你直接运行 go run main.go 而没提前用 source .env 或 env $(cat .env | xargs) go run main.go,os.Getenv 拿到的全是空值。
推荐用 github.com/joho/godotenv 加载 .env
这是最轻量、最常用的选择,兼容大多数 .env 语法(注释、引号、变量内插等),且不侵入全局 os.Environ(),可按需调用 godotenv.Load 或 godotenv.Overload。
-
godotenv.Load(".env"):只加载,不覆盖已存在的环境变量 -
godotenv.Overload(".env"):加载并覆盖同名变量(适合本地开发覆盖默认值) - 文件路径支持相对路径,建议用
filepath.Join(".", ".env")显式指定,避免工作目录影响 - 务必在
main()开头尽早调用,否则依赖环境变量的初始化(如数据库连接)会失败
示例:
func main() {
if err := godotenv.Overload(); err != nil {
log.Fatal("加载 .env 失败:", err)
}
dbUser := os.Getenv("DB_USER")
// ...
}注意 .env 文件格式陷阱
看似简单的键值对,实际容易因格式问题静默失败:
立即学习“go语言免费学习笔记(深入)”;
- 等号两侧不能有空格:
PORT=8080✅,PORT = 8080❌(会被当作文本而非键值) - 值含空格时必须加引号:
API_URL="https://api.example.com/v1",否则只取到https://api.example.com/v1前半段 - 注释只能独占一行,以
#开头;KEY=value # comment不被识别为注释 - 不支持跨行或反斜杠续行,每个变量必须单行定义
生产环境别用 .env 文件
容器化部署(Docker/K8s)或云平台(AWS ECS、GCP Cloud Run)中,应通过原生机制注入环境变量:docker run -e DB_PASSWORD=xxx、K8s 的 envFrom: secretRef 等。硬编码 .env 到镜像里属于严重安全风险,且违背十二要素应用原则。
本地开发用 .env 可以,但记得把 .env 加进 .gitignore;CI/CD 流水线里也应禁用该文件,改用平台提供的密钥管理方式。










