| 
             Writing a basic HTTP server is easy using the
net/http package. 
           | 
          
              
          
package main
 
           | 
        
        
        
          | 
            
           | 
          
            
          import (
    "fmt"
    "net/http"
)
           | 
        
        
        
          | 
             A fundamental concept in net/http servers is
handlers. A handler is an object implementing the
http.Handler interface. A common way to write
a handler is by using the http.HandlerFunc adapter
on functions with the appropriate signature. 
           | 
          
            
          
func hello(w http.ResponseWriter, req *http.Request) {
           | 
        
        
        
          | 
             Functions serving as handlers take a
http.ResponseWriter and a http.Request as
arguments. The response writer is used to fill in the
HTTP response. Here our simple response is just
“hello\n”. 
           | 
          
            
          
    fmt.Fprintf(w, "hello\n")
}
           | 
        
        
        
          | 
            
           | 
          
            
          func headers(w http.ResponseWriter, req *http.Request) {
           | 
        
        
        
          | 
             This handler does something a little more
sophisticated by reading all the HTTP request
headers and echoing them into the response body. 
           | 
          
            
          
    for name, headers := range req.Header {
        for _, h := range headers {
            fmt.Fprintf(w, "%v: %v\n", name, h)
        }
    }
}
           | 
        
        
        
          | 
            
           | 
          
            
          func main() {
           | 
        
        
        
          | 
             We register our handlers on server routes using the
http.HandleFunc convenience function. It sets up
the default router in the net/http package and
takes a function as an argument. 
           | 
          
            
          
    http.HandleFunc("/hello", hello)
    http.HandleFunc("/headers", headers)
           | 
        
        
        
          | 
             Finally, we call the ListenAndServe with the port
and a handler. nil tells it to use the default
router we’ve just set up. 
           | 
          
            
          
    http.ListenAndServe(":8090", nil)
}
           |