我对http处理程序和处理错误或重定向等事情感到有些困惑。
例如,如果由于某些条件检查我必须重定向,我是否应该执行以下操作:
func SomeHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
if thisThing != thatThing {
log.Print("thisThing not equal to thatThing - redirecting")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return // <-- is this necessary?
}
}
答案 0 :(得分:5)
当您完成处理时,规则为return
,以防止进一步处理。
在您的情况下,不需要return
,因为您的功能中没有进一步处理。但是,如果你有进一步的逻辑,你会想要返回:
func SomeHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
if thisThing != thatThing {
log.Print("thisThing not equal to thatThing - redirecting")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
return // <-- is this necessary?
}
w.Header().Add("Content-Type", "application/json")
// ... add a normal response
}
在这种情况下,如果没有返回,您将发送标头以启动重定向,然后您 发送正常的JSON响应。这显然不是你想要的,所以需要return
。
精明的读者会注意到,还有其他方法可以实现这种控制流程。 else
是一个选项:
func SomeHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
if thisThing != thatThing {
log.Print("thisThing not equal to thatThing - redirecting")
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
} else {
w.Header().Add("Content-Type", "application/json")
// ... add a normal response
}
}
但是,随着条件的复杂性增加,return
通常是最易读的方法。但在这一点上,它最终是一种风格选择。
答案 1 :(得分:0)
return
用于从函数初步退出并将值返回给调用者。正如之前所指出的那样,如果不再有指令功能将退出,而不是自己
何时使用return
?
Go的一个关键想法是可读性 - 每个程序都应该易于阅读。所以Go代码是垂直构造的 - 主流在左上方从上到下呈直线。它通常被视为“好”或“基本”场景。所有转移都向右转。许多转移通常非常简单 - 例如,它可能是错误的解决方法并退出。
例如,您有一个函数是否为正数:
func IsPositive(n int) bool {
if n <= 0 {
return false
}
return true
}
您可以在左侧跟踪主要执行行,并在检查题表IsPositive
下方和if ...
下方抓住关键字return true
。如您所见,我们不使用else
。我们“免费”(没有视觉超载)将其作为我们计划中唯一的剩余选项。我可以说这种结构化的函数很少需要else
。此外,您不会经常在标准代码上找到关键字。