if这个序列可以写得更优雅吗? [关闭]

问题描述 投票:0回答:1
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字段。看起来像一些小可爱的地图迭代器或类似的东西可以工作,但我无法找到一个很好的解决方案。

go
1个回答
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时,这才有效。它的相对优雅也值得商榷。

© www.soinside.com 2019 - 2024. All rights reserved.