if这个序列可以写得更优雅吗?

时间:2017-12-15 22:23:20

标签: go

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字段。看起来像一些小可爱的地图迭代器或类似的东西会起作用,但我无法找到一个很好的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用一些辅助函数:

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时才有效。它的相对优雅也值得商榷。