I am studying web development in Golang (Beginner) I came across some code I played around with and I'm not too sure why it works, I looked through the library source code and docs but I only have a vague idea it still isn't clicking. Note the code below:
package main
import (
"fmt"
"net/http"
)
type foo int
func (m foo) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Some text")
}
func main() {
var bar foo
http.ListenAndServe(":8080", bar)
}
From what I understand adding *ServeHTTP(w http.ResponseWriter, r http.Request) as a function method, implements the handler interface (if I'm saying that correctly) and now foo is of type handler as well. I also understand that http.ListenAndServe takes an input of type handler so that is where my variable bar comes into play. When I run the code and go to localhost:8080 on my browser I get "Some Text" appearing.
Question:
How does this exactly work? How is that ServeHTTP function being accessed?
I tried looking at the source code of the libraries but couldn't pinpoint exactly how ServeHTTP worked. I found these two pieces of code (not sure if this is applicable) that sort of gave me the idea it was implementing a function but need clarification:
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
I have never seen a type declaration as the one above with HandlerFunc that has a function after the name of the type. I have also seen how methods are declared but not sure what is happening in the code above.
HandlerFunc
has nothing to do with your actual question ("How is that ServeHTTP function being accessed?") but to clarify, it is just a normal type declaration, just as you didtype foo int
definingfoo
as being of kind integer so you can dotype fn func()
wherefn
is a type of kind func with that specific signature (no args, no return values). SoHandlerFunc
is a type whose definition is: a function with two arguments (whose types areResponseWriter
and*Request
) and no return values. – FaenzaServeHTTP
method onHandlerFunc
is no different from having it onfoo
. – Faenzahttp.Handler
interface, this is important because the former could mean anything the latter is specific and can be found in the documentation. – Faenza