goland统一设置启动环境变量需同时配置两处:settings→go→go environment设项目级变量(如go111module=on),并run→edit configurations→templates→go build中勾选“include system environment variables”且填写业务变量,缺一则os.getenv取不到值。

GoLand 里设置启动环境变量,不是填一次就全局生效——必须分清“项目级变量”和“运行配置级变量”两层,漏掉任一层,os.Getenv 就拿不到值。
Settings → Go → Go Environment 是项目级兜底位置
这个位置设的变量,会被所有新建的 Run Configuration 自动继承(但已有配置不会自动更新)。它不直接传给你的 Go 进程,而是作为模板基底存在。
- 路径:File → Settings → Go → Go Environment → Environment 右侧的
... - 必须填的典型变量:
GO111MODULE=on、GOROOT=/usr/local/go(macOS/Linux)或GOROOT=D:\go(Windows)、GOBIN=$GOPATH/bin - 别写错路径变量语法:
$PROJECT_DIR和$GOPATH是 GoLand 内置变量,%GOPATH%是 Windows 系统变量,混用会失效 - 改完必须重启 GoLand,尤其 macOS/Linux 从桌面图标启动时,
.zshrc里的export不会被加载
Run → Edit Configurations → Templates → Go Build 的 Environment variables 是关键注入点
真正决定你 main() 里 os.Getenv("APP_ENV") 能否取到值的,是这里。IDE 默认不把项目级变量自动塞进去,必须手动勾选并填写。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- 进入路径:Run → Edit Configurations → Templates → Go Build
- 务必勾选
Include system environment variables,否则HOME、USER等基础变量丢失,调exec.Command("sh", "-c", "whoami")会失败 - 在下方
Environment variables栏点...,添加业务变量,如:APP_ENV=dev、LOG_LEVEL=debug - 已存在的运行配置不会自动同步该模板,需手动打开每个配置,勾选
Use template settings,或删掉重配
为什么在单个 Run Configuration 里填 Environment variables 没用?
常见错误是只在某个具体配置(比如叫 api-server)的 Environment variables 里填了 APP_ENV=staging,结果新增一个 admin-cli 配置后,它完全没这个变量——调试行为不一致,问题难复现。
- 这种填法只作用于当前配置,无法跨配置共享
- 当你加新配置(如
go run ./cmd/admin),它默认用空环境启动,os.Getenv("APP_ENV")返回空字符串 - 更隐蔽的问题:测试配置(
Templates → Go Test)和构建配置是分开的,GO111MODULE=on在 Go Build 里设了,但 Go Test 没设,就会报go: modules disabled
验证是否真生效,别信 IDE 界面显示
IDE 配置界面里看着有值,不代表进程里真能读到。最可靠的方式是让代码自己说话。
- 在
main()开头加一行:fmt.Println("APP_ENV =", os.Getenv("APP_ENV")) - 运行后看控制台输出,不是看 Run Configuration 窗口里的 Environment 字段
- 如果用了
cgo或exec.Command("bash", "-c", "echo $APP_ENV"),必须确保对应配置勾选了Include system environment variables,否则子 shell 完全看不到 - Windows 用户改了系统环境变量后,必须重启 GoLand;macOS/Linux 用户若从终端外启动,
.zshrc不生效,得改 GoLand 设置或从终端用goland .启动
真正统一的关键,是让 Templates → Go Build 管住所有新建配置,再用 Settings → Go → Go Environment 做项目级兜底——两者缺一不可,且都得填对位置、写对语法。最容易被跳过的,是模板勾选和已有配置的手动同步。










