返回void函数和另一个void函数的结果?

时间:2016-01-17 01:55:46

标签: go idiomatic

我正在努力想出一种非常紧凑的方法来处理REST API的HTTP请求中可能出现的问题。

我需要测试许多条件,以及针对这些条件失败的许多潜在错误响应。

我的处理流程看起来类似于以下内容:

// Error is actually a method on some struct, so it's only relevant for demonstration purposes.
func Error(w http.ResponseWriter, status int, message string) {
  // Lots of stuff omitted
  w.WriteHeader(status)
  w.WriteJson(r)
}

func HandleSomething(w http.ResponseWriter, r *http.Request) {
  if someCondition != true {
    Error(w, 500, "Some error occurred!")
    return
  }
  if someOtherCondition != true {
    Error(w, 500, "Some other error occurred!")
    return
  }
  if yetAnotherCondition != true {
    Error(w, 500, "Yet another error occurred!")
    return
  }
  if andFinallyOneLastCondition != true {
    Error(w, 500, "One final error occurred!")
    return
  }
  // All good! Send back some real data.
  w.WriteJson(someObject)
}

由于我需要测试5-10个条件,以及其他操作中可能出现的其他错误,因此能够将其压缩到以下内容会很好:

func HandleSomething(w http.ResponseWriter, r *http.Request) {
  if someCondition != true {
    return Error(w, 500, "Some error occurred!")
  }
  if someOtherCondition != true {
    return Error(w, 500, "Some other error occurred!")
  }
  if yetAnotherCondition != true {
    return Error(w, 500, "Yet another error occurred!")
  }
  if andFinallyOneLastCondition != true {
    return Error(w, 500, "One final error occurred!")
  }
  // All good! Send back some real data.
  w.WriteJson(someObject)
}

但是,Go编译器不喜欢这个。

它抱怨我正在尝试使用Error()的结果作为值,并且我试图返回太多的参数。确切的错误消息是:

foo.go:41: bar.Response.Error(400, "InvalidRequest", "Error decoding request") used as value
foo.go:41: too many arguments to return

但是Error()HandleSomething()都有相同的返回签名(例如它们都没有返回),所以不应该这样做吗?

每个if语句都包含return,这一点很重要,因为该函数应该立即退出。如果Error()可以某种方式停止执行调用函数,那对我也有用。有点像testing.FailNow(),但我相信它依赖于Goroutines。

顺便说一句:我意识到这些并非真正的“无效”功能,但却无法想到更合适的名称。对于在Go中没有返回任何内容的函数,是否有正确的名称?

2 个答案:

答案 0 :(得分:-1)

C ++允许这样做。这对模板非常方便。

但是你看到Go没有。我不确定具体的步骤,但这似乎是你可以要求添加到Go中的东西,也许它可以用于1.7。

至于现在的解决方案,也许你可以返回一个未使用的error。只需从nil函数返回Error

答案 1 :(得分:-1)

我不确定,但我会用if-else时尚

来做
func HandleSomething(w http.ResponseWriter, r *http.Request) {
  if someCondition != true {
    Error(w, 500, "Some error occurred!")
  } else if someOtherCondition != true {
    Error(w, 500, "Some other error occurred!")
  } else if yetAnotherCondition != true {
    Error(w, 500, "Yet another error occurred!")
  } else if andFinallyOneLastCondition != true {
    Error(w, 500, "One final error occurred!")
  } else {
    // All good! Send back some real data.
    w.WriteJson(someObject)
  }
}