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, invokes 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.
EDIT: Implements the interface is the proper term NOT invoke.
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.
HandlerFunchas 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 intdefiningfooas being of kind integer so you can dotype fn func()wherefnis a type of kind func with that specific signature (no args, no return values). SoHandlerFuncis a type whose definition is: a function with two arguments (whose types areResponseWriterand*Request) and no return values. - mkoprivaServeHTTPmethod onHandlerFuncis no different from having it onfoo. - mkoprivahttp.Handlerinterface, this is important because the former could mean anything the latter is specific and can be found in the documentation. - mkopriva