Learning to Go: Part 2 - Hello World

Search for a command to run...

No comments yet. Be the first to comment.
Learn to write Go code by creating a basic web app that will provide a front-end for a public API
Oh hi! This is a multi-part tutorial series, please make sure you reads the posts in order! You can find the list at the bottom of the page. Welcome back fellow Go newbies! In this stage of our tutorial we’ll use a templating library to help us rende...
Next up in my quest to Learn All The Things™ on the CNCF graduated projects page, we’re going to take a look at a lesser known Argo project: Argo Rollouts. In a nutshell, Argo Rollouts are a drop-in replacement for the Deployment object that provide ...

Continuing my efforts to explore and Learn All The Things™ on the CNCF graduated projects page, today I’m going to take a look at Argo Workflows, which is one of 4 tools in the Argo project overall (see my previous post on ArgoCD). Argo Workflows is ...

In my never-ending quest to Learn All The Things™, I’ve decided to take a tour through the Cloud Native Computing Foundation’s graduated projects page. I’m doing this for a few different reasons: Lea

This is the tenth post in a series exploring the features of GKE Enterprise, formerly known as Anthos. GKE Enterprise is an additional subscription service for GKE that adds configuration and policy management, service mesh and other features to supp...

This is the ninth post in a series exploring the features of GKE Enterprise, formerly known as Anthos. GKE Enterprise is an additional subscription service for GKE that adds configuration and policy management, service mesh and other features to supp...

Oh hi! This is a multi-part tutorial series, please make sure you reads the posts in order! You can find the list at the bottom of the page.
We'll start by creating a new file called main.go, and writing our first line:
package main
All Go programs must form a package, which is just a way of grouping files together. If a Go program should run on its own (rather than just being referenced by another program), it needs to be in a package called main and contain a function called main as well (we’ll write that in a moment). If you’re coming from a procedural/scripting background, functions are just a way of organising the different bits of our program that do different things. Okay, next line!
import "net/http"
Here we’re importing the net/http library. You may have seen similar imports in other programming langauges. The Go community has gone to the trouble of writing some excellent functions for handling HTTP requests, so we’re going to use those rather than re-invent the wheel. Importing this library lets us use all of that lovely code.
Now let’s write our first function:
func indexHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("<h1>Hello World!</h1>"))
}
This function is called indexHandler. Functions in Go are defined with a name, then optionally the list of parameters or inputs they will accept in brackets, followed by - again optionally - a return type. This function is a little odd as it takes 2 inputs but returns nothing itself. The inputs are:
an http.ResponseWriter assigned to the variable w
a pointer to an http.Request assigned to the variable r
Please don’t worry about pointers yet!
Rather than have the function return anything, it simply accesses the http.ResponseWriter directly. The Write function expects some bytes, which is why we use []byte, but don’t worry too much about that. As you can see, we’re just sending it some HTML to render the words: “Hello World!”.
Now it’s time to write our main function. Like we said before, this is the primary function of our program and it will run when the program starts. First let’s write the skeleton of the function:
func main() {
}
Now inside the function (between the { and }) let’s add some more code. First:
mux := http.NewServeMux()
Here we create the variable mux by using NewServeMux() in the http library. This function of the library provides us with an HTTP multiplexer, which is just a smart function that can deal with requests to different URLs and paths.
Note that := is just Go shorthand for creating a variable and infering it’s type at the same time. Let’s add the next line:
mux.HandleFunc("/", indexHandler)
Here we call the HandleFunc function belonging to our mux variable and send it 2 inputs: "/" and indexHandler. The HandleFunc function sets up handlers for different URL paths. So here we’re telling it that requests for "/" should be dealt with by the function called indexHandler.
Now one last line for main:
http.ListenAndServe(":8080", mux)
This calls the ListenAndServe function that belongs to the http library. We’re calling it directly as it’s a public function of the library, passing in a port number of our choosing to listen to, and the mux variable we already created. This sets up an HTTP server on port 8080 and passes requests to mux to decide where to send them. The server will continue to listen on a loop until it is terminated.
That’s it for now, so save the file. We can run this program from the terminal with:
go run main.go
Or we could build a binary with:
go build -o server main.go
And run it with:
./server
Either way, you should then be able to reach http://localhost:8080 in a browser and see your Hello World! message.

Nice work! You’ve written your first Go program :-) Now move on to part 3.
Here’s the complete code of main.go if you need to check yours for errors:
package main
import "net/http"
func indexHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("<h1>Hello World!</h1>"))
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", indexHandler)
http.ListenAndServe(":8080", mux)
}