Golang HTTP处理函数

I saw some http handler function declarations are varied. Two of them I found are the standard function and the one returning anonymous function inside the handler. For example:

Using standard way:

func helloworld(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello World")
}

This the most straight way to declare a handler for an http api.

Another way is using anonym/closure function inside the handler function:

func helloworld2() http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
        fmt.Fprintln(w, "Hello World")
    })
}

What are the differences and the benefit? When to use one of them? What's the best practice?

Returning an anonymous function is the only way to work with handlers that require additional arguments, by returning a closure. Example:

func fooHandler(db *someDatabase) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // do something with `db` variable
    }
}

Otherwise, there's typically no practical difference between the approaches. One may choose to use the anonymous function universally for consistency.

Pattern

func Middleware(next http.Handler) http.Handler{
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    // Do something
    next.ServeHTTP(w, r)
  })
}

often used to construct middleware chain like

http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))