Middleware in Go is implemented by wrapping handler functions or multiplexers. A middleware function takes an http.Handler and returns a new http.Handler that can perform actions before and after calling the original handler. This pattern allows you to compose behaviors like logging, authentication, and error handling.
The example shows a logging middleware that prints request information before passing control to the next handler. You can chain multiple middleware by nesting calls, creating a clean and composable architecture. Each middleware layer has the opportunity to modify the request, observe the response, or even short-circuit the chain.
The key to middleware design in Go is understanding that http.Handler is just an interface with a single method ServeHTTP. By wrapping handlers and calling the wrapped handler’s ServeHTTP method, you can insert custom logic at any point in the request-response cycle.