应填入Program arguments栏,如--env=prod --config=config.yaml;填Environment variables栏则只能通过os.Getenv()读取,无法被flag.Parse()或os.Args获取。

Program arguments 是传命令行参数的地方,不是 Environment variables,也不是 VM options。填错位置,参数根本不会进 os.Args,代码里用 flag.Parse() 或 os.Args[1:] 读不到。
参数该填在 Program arguments 还是 Environment variables?
看你要做什么:
- 想让
main.go解析--env=prod、--config=config.yaml这类 flag —— 必须填进Program arguments栏,空格分隔,例如:--env=staging --log-level=debug - 想让代码通过
os.Getenv("GO_ENV")读取环境变量 —— 填进Environment variables栏,格式是GO_ENV=production,不能写成export GO_ENV=production -
VM options是给 JVM 用的,Go 不走 JVM,往里填-v或--cover会报flag provided but not defined
常见错误:把 --env=prod 塞进环境变量栏,结果 flag.Parse() 完全收不到,但 os.Getenv("env") 也拿不到(因为键名是 --env,不是 env)。
测试时加 -v、-run、-cover 怎么配
GoLand 的 go test 配置和普通运行配置共享同一套逻辑,但容易踩坑:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
Program arguments里直接写:-v -cover -run "TestParseConfig/valid"(子测试名必须用英文双引号包裹,斜杠不能省) - 不加引号,GoLand 会在空格或斜杠处截断,
go test实际收到的是-run TestParseConfig,后面被丢弃 - 临时测试配置默认不保存参数,右键 Run 后改了参数,下次再点就还原 —— 想固定下来,得在右上角配置下拉列表里找到那个半透明图标配置,点 ⋯ → Save Configuration As
- 覆盖率文件如
-coverprofile=coverage.out写进去后,还需手动执行go tool cover -html=coverage.out才能看报告
多个环境(dev/staging/prod)怎么快速切换
别每次手动改参数,用「复制配置」机制:
- 先建一个基础配置,比如叫
Run (dev),Program arguments填--env=development,Environment variables填GO_ENV=development - 右键该配置 → Duplicate,新配置命名为
Run (prod),只改两处:Program arguments改成--env=production,Environment variables改成GO_ENV=production - 工作目录(
Working directory)建议统一设为项目根目录,避免相对路径加载配置失败 - 如果用了
go run临时运行单个文件,它不会继承这些配置 —— 要确保你点的是右上角那个配置下拉框里的名字,而不是编辑器边栏的绿色三角(那是临时运行)
为什么打包后执行没生效,但 GoLand 里能跑
本质不是 IDE 问题,而是参数没带过去:
-
go run和最终二进制的行为完全一致,参数传递机制没变 - 常见原因一:你在 GoLand 的
Run配置里写了参数,但Go Build配置里没同步 —— 构建出来的二进制没被运行配置“绑定”,手动执行时得自己补全:./myapp --env=prod - 原因二:你只在
Go Test配置里加了-v,但想调试main函数时却点了Debug图标,而 Debug 配置是独立的,没填参数 - 解决办法:建好
Run配置后,Duplicate 一份,Type 改成Go Build或保持不变,然后用Debug图标启动 —— 这样参数和环境变量才真正复用
最易忽略的一点:GoLand 不会自动把新写的 cmd/admin/main.go 加进 Package path 下拉列表,得先确认 go list ./cmd/admin 能返回结果,再检查是否被标记为 Excluded 或 go.mod 未包含该路径。

















