Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 这一系列的“如果”能写得更优雅些吗?_Go - Fatal编程技术网

Go 这一系列的“如果”能写得更优雅些吗?

Go 这一系列的“如果”能写得更优雅些吗?,go,Go,“c”是以下结构 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.Lookup

“c”是以下结构

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
}

我只想在环境变量存在时更新struct字段。看起来像是一个可爱的地图迭代器或类似的东西可以工作,但我想不出一个好的解决方案。

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

type Configuration struct {
    HTTPPort   int
    DBUserName string
    DBPasswd   string
    DBPort     int
    DBHost     string
}

这只有在忽略试图解析为int的字符串env var时才有效。它的相对优雅性也值得商榷。

我们是否可以更进一步,使用“val”上的类型开关和类型接口{}使其成为一个单独的帮助器?可以,但我将把它作为练习留给您。应该有您需要的。如果没有设置,值是什么?如果它们默认为空,则只需执行c.DBUserName=os.GetenvIDAASDBPWand、c.HTTPPort、=strconv.AtoiIDAASHTTPPORT,如果环境变量丢失,则会将其保留为零。如果希望以通用方式执行此操作,则可以向提供环境变量名称和数据类型的字段添加结构标记。然后可以编写一个函数,使用反射填充字段。这样,如果您添加了一个新字段,您所要做的就是用适当的标记定义该字段。@DavidBudworth,您看不到的是我有默认值,并首先检查TOML文件的配置,然后覆盖是否存在环境变量,以便将来我可以为Docker或无服务器部署支持12因子。
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...