应使用 Viper + 环境变量驱动配置加载,避免硬编码环境判断;需显式设置 config name、path、type,启用 AutomaticEnv 并配置 key replacer,结构体字段必须加 yaml tag,生产环境禁用 WatchConfig。
直接用 Viper + 环境变量驱动加载,别手写 if env == "prod" 分支
。Go 原生不识别环境概念,所有“多环境”都是靠外部传入(如
)+ 配置加载逻辑实现的。硬编码判断或编译标签(
)在运行时完全失效,且破坏配置可移植性。
为什么 viper.ReadInConfig() 总是读不到 config.prod.yaml?
因为
默认只找固定名字(如
),不会自动拼接环境名。它不解析
变量,也不会尝试
。
必须显式设置:先
,再
如果没设
,要 fallback:比如
调用
前,务必加
,否则扩展名缺失会报
不要把
和
都
一遍——viper 会 merge 它们,导致生产环境意外继承 dev 的 debug 开关
环境变量为啥总 fallback 到默认值?
因为
默认忽略系统环境变量,除非你告诉它“去查”。
不会自动映射到
,除非你做了绑定。
最新版本ArcGIS For Android Eclipse环境配置 中文WORD版
ArcGIS for Android SDK 目前最新版本为10.2.5 从此版本开始ESRI不在提供Eclipse的插件支持,官方的帮助也针对于Android Studio的支持;本文档主要讲述的内容是最新版本ArcGIS For Android Eclipse环境配置;感兴趣的朋友可以过来看看
下载
最简方案:尽早调用
,它会把
映射为
(点号转大写下划线)
若需自定义映射(比如环境变量叫
,但配置项是
),用
注意
:设了前缀后,
才会映射到
;不设就只能匹配裸变量名
是必须的,否则
找不到
(viper 不处理点号层级,只做字符串替换)
viper.Unmarshal() 后结构体字段还是空?
不是配置没读到,而是 Go 反射找不到对应字段——
只认
tag,不猜命名规则。
所有嵌套字段都必须显式加 tag:
、
tag 值必须和 YAML 键严格一致(区分大小写),
≠
≠
别指望 “
字段自动匹配
环境变量”,那是
的事;对 YAML 文件,它只看 tag
如果用了
tag(比如
),得额外调用
,否则无效
最容易被忽略的是:生产环境必须禁用
。热重载触发 panic 会导致服务直接退出,而日志里可能只留下一行
—— 实际是某个配置项在重载时被清空又没校验。
ENV=prod//go:buildviper.ReadInConfig()config.yamlENVconfig.$ENV.yamlviper.SetConfigName("config-" + os.Getenv("ENV"))viper.AddConfigPath("./configs")ENVenv := os.Getenv("ENV"); if env == "" { env = "dev" }viper.ReadInConfig()viper.SetConfigType("yaml")Unsupported Config Type ""config-dev.yamlconfig-prod.yamlReadInConfig()viperviper.GetString("db.host")DB_HOSTviper.AutomaticEnv()db.hostDB_HOSTPGHOSTdb.hostviper.BindEnv("db.host", "PGHOST")viper.SetEnvPrefix("app")APP_DB_HOSTdb.hostviper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))server.portSERVER.PORTviperyamltype Config struct { DB DBConfig `yaml:"db"` }type DBConfig struct { Host string `yaml:"host"` }hostHostHOSTdbHostDB_HOSTAutomaticEnv()mapstructuremapstructure:"host"viper.UnmarshalKey("db", &dbCfg, viper.DecodeHook(mapstructure.DecodeHookFunc()))viper.WatchConfig()panic: interface conversion: interface {} is nil, not string