HTTP处理程序 - 何时应该使用return?

时间:2017-11-22 07:33:17

标签: go

我对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?
    }
 }

2 个答案:

答案 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。此外,您不会经常在标准代码上找到关键字。