本文介绍两种主流方式:通过 heroku 配置变量(推荐用于云部署)和 go 的 flag 包(适用于本地调试或可执行文件分发),帮助你在 go 应用中动态加载 dev/prod 配置。
本文介绍两种主流方式:通过 heroku 配置变量(推荐用于云部署)和 go 的 flag 包(适用于本地调试或可执行文件分发),帮助你在 go 应用中动态加载 dev/prod 配置。
在 Go 应用部署到 Heroku 时,不建议使用命令行参数作为环境区分的主要手段,因为 Heroku 的 Procfile 启动机制不支持为每个 dyno 动态传入不同 flag(如 -appmode=PROD),且配置与代码耦合度高、难以审计。官方推荐方案是使用 环境变量(Config Vars) —— 安全、可管理、符合十二要素应用原则。
✅ 推荐方式:Heroku 环境变量(os.Getenv)
-
设置环境变量(在项目根目录执行):
heroku config:set APPMODE=PROD # 生产环境 # 或 heroku config:set APPMODE=DEV # 开发环境(仅测试用)
-
在 Go 代码中读取(无需额外依赖):
package main import ( "fmt" "os" ) var appMode string func init() { appMode = os.Getenv("APPMODE") if appMode == "" { appMode = "DEV" // 默认回退策略,提升健壮性 } } func main() { fmt.Printf("Running in %s mode\n", appMode) // 根据 appMode 加载对应配置:config/dev.yaml / config/prod.yaml // 或初始化不同数据库连接、日志级别等 }
✅ 优势:配置与代码分离;可通过 heroku config 实时查看/修改;支持团队协作权限管控;天然兼容 CI/CD 流水线。
⚠️ 备选方式:Go flag 包(适用于本地或自托管场景)
若需在本地快速切换模式(如 ./myapp -appmode=DEV),或构建为独立二进制分发,可结合 flag 包:
package main
import (
"flag"
"fmt"
)
var appMode *string
func init() {
appMode = flag.String("appmode", "DEV", "Application mode: DEV or PROD")
flag.Parse() // 必须调用,否则不会解析
}
func main() {
fmt.Printf("Flag-based mode: %s\n", *appMode)
// 注意:此处不能替代环境变量逻辑,因 Heroku 不执行 flag 解析
}
⚠️ 重要限制:Heroku 的 web: 进程在 Procfile 中固定启动命令(如 web: ./myapp),无法向其注入 -appmode=PROD 参数。强行使用将导致启动失败或被忽略。因此该方式仅适用于本地开发、Docker 容器或非 Heroku 部署场景。
? 最佳实践建议
-
生产环境强制校验:在 main() 中加入检查,防止未设置 APPMODE 导致误启:
if appMode != "DEV" && appMode != "PROD" { panic("APPMODE must be 'DEV' or 'PROD'") } - 敏感配置隔离:数据库密码、API 密钥等应始终通过环境变量注入,切勿硬编码或通过 flag 传递。
- 配置中心延伸:当环境增多(STAGING/UAT)或配置项复杂时,可引入 viper 库统一管理环境变量 + YAML 文件。
通过合理组合 os.Getenv 与 Heroku Config Vars,你既能保障云环境的安全可控,又能保持代码简洁可维护——这才是面向生产的 Go 应用配置之道。











