Handling 404s
The behavior of the default Handler is to pass any request that does not have a handler function defined to /. Returning to the first example, if a request is made to a non-existent page, the handler function for / is called, and a 200 along with the “Hello World” response is returned.
curl -is http://localhost:8000/asdfa HTTP/1.1 200 OK Date: Thu, 17 Nov 2016 09:07:51 GMT Content-Length: 12 Content-Type: text/plain; charset=utf-8
As the route does not exist, a 404 Page Not Found should be returned. On the default route, a check can be added to return a 404 if the path is not / (see Listing 18.2).
LISTING 18.2 Adding a 404 Response
1: package main 2: 3: import ( 4: "net/http" 5: ) 6: 7: func helloWorld(w http.ResponseWriter, r *http.Request) { 8: if r.URL.Path != "/" { 9: http.NotFound(w, r) 10: return 11: } 12: w.Write([]byte("Hello World\n")) 13: } 14: 15: func main() { 16: http.HandleFunc("/", helloWorld) 17: http.ListenAndServe(":8000", nil) 18: }
The modifications to the initial Hello World web server may be explained as follows:
In the helloWorld handler function, the path is checked to see if it is /.
If it is not, the NotFound method from the http package is called, passing the response and request. This writes a 404 response to the client.
If the path does match /, then the if statement is ignored and the Hello World response is sent.