Go Web Development Cookbook
上QQ阅读APP看书,第一时间看更新

How it works…

Once we run the program, the HTTP server will start locally listening on port 8080.

Opening http://localhost:8080 in a browser will display Hello World! from the server with the Content-Encoding response header value gzip, as shown in the following screenshot:

Hello World!

Let’s understand what each line in the program means:

  • package main: This defines the package name of the program.
  • import ( "io" "net/http" "github.com/gorilla/handlers" ): This is a preprocessor command that tells the Go compiler to include all files from io, net/http, and the github.com/gorilla/handlers package.
  • const ( CONN_HOST = "localhost" CONN_PORT = "8080" ): We declare constants in a Go program using the const keyword. Here, we declared two constants—one is CONN_HOST with a value of localhost and another is CONN_PORT with a value of 8080.
  • func helloWorld(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello World!")}: This is a Go function that takes ResponseWriter and Request as input parameters and writes Hello World! on the HTTP response stream.

Next, we declared the main() method from where the program execution begins. As this method does a lot of things, let’s understand it line by line:

  • mux := http.NewServeMux(): This allocates and returns a new HTTP request multiplexer (ServeMux), which matches the URL of each incoming request against a list of registered patterns and calls the handler for the pattern that most closely matches the URL. One of the benefits of using it is that the program has complete control over the handlers used with the server, although any handlers registered with the DefaultServeMux are ignored.
  • http.HandleFunc("/", helloWorld): Here, we are registering the helloWorld function with the / URL pattern using HandleFunc of the net/http package, which means helloWorld gets executed, passing (http.ResponseWriter, *http.Request) as a parameter to it whenever we access the HTTP URL with the / pattern.
  • err := http.ListenAndServe(CONN_HOST+":"+CONN_PORT, handlers.CompressHandler(mux)): Here, we are calling http.ListenAndServe to serve HTTP requests that handle each incoming connection in a separate Goroutine for us. ListenAndServe accepts two parameters—server address and handler. Here, we are passing the server address as localhost:8080 and handler as CompressHandler, which wraps our server with a .gzip handler to compress all responses in a .gzip format.
  • if err != nil { log.Fatal("error starting http server: ", err) return}: Here, we check whether there is any problem in starting the server. If there is, then log the error and exit with a status code of 1.