if v, ok := os.LookupEnv("IDAASHTTPPORT"); ok {
c.HTTPPort, _ = strconv.Atoi(v)
}
if v, ok := os.LookupEnv("IDAASDBNAME"); ok {
c.DBUserName = v
}
if v, ok := os.LookupEnv("IDAASDBPW"); ok {
c.DBPasswd = v
}
if v, ok := os.LookupEnv("IDAASDBPORT"); ok {
c.DBPort, _ = strconv.Atoi(v)
}
if v, ok := os.LookupEnv("IDAASDBHOST"); ok {
c.DBHost = v
}
'c'是以下结构
type Configuration struct {
HTTPPort int
DBUserName string
DBPasswd string
DBPort int
DBHost string
}
如果环境变量存在,我只想更新struct字段。看起来像一些小可爱的地图迭代器或类似的东西可以工作,但我无法找到一个很好的解决方案。
您可以使用一些辅助函数:
func setIntFromEnv(val *int, envName string) {
if v, ok := os.LookupEnv(envName); ok {
*val, _ = strconv.Atoi(v)
}
}
func setStringFromEnv(val *string, envName string) {
if v, ok := os.LookupEnv(envName); ok {
*val = v
}
}
// From your main function.
setIntFromEnv(&c.HTTPPort, "IDAASHTTPPORT")
setStringFromEnv(&c.DBUserName, "IDAASDBNAME")
etc...
只有在忽略了您尝试将其解析为int的字符串env var时,这才有效。它的相对优雅也值得商榷。