为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Helenr 2021-12-07 10:45:56
我正在尝试提出一种非常紧凑的方法来处理 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 valuefoo.go:41: too many arguments to return但两者Error()并HandleSomething()具有相同的返回签名(例如,它们都返回什么),所以不宜这项工作?每个if语句都包含 a很重要return,因为函数应该立即退出。如果Error()可以以某种方式停止调用函数的执行,那也对我有用。testing.FailNow()有点像,但我相信这依赖于 Goroutines。顺便说一句:我意识到这些并不是真正的“空”函数,但想不出更合适的名称。在 Go 中不返回任何内容的函数是否有合适的名称?
查看完整描述

2 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

我不确定,但我会用 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)

  }

}


查看完整回答
反对 回复 2021-12-07
?
忽然笑

TA贡献1806条经验 获得超5个赞

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

但正如你所见,Go 没有。我不确定确切的步骤,但这似乎是您可以要求添加到 Go 中的东西,也许它可以用于 1.7。

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


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信