Get started with Go

Andrew Gerrand
Google
https://plus.google.com/106356964679457436995
@enneff
http://golang.org

* Background

# In this tutorial I'll show you how to install and use the Go Programming Language.

* What is Go?

Go is a new, general-purpose programming language.

- Compiled
- Statically typed
- Concurrent
- Simple
- Productive

"Go is a wise, clean, insightful, fresh thinking approach to the greatest-hits subset of the well understood."
- Michael T. Jones


* History

- Project starts at Google in 2007 (by Griesemer, Pike, Thompson)
- Open source release in November 2009
- More than 250 contributors join the project
- Version 1.0 release in March 2012

# Go was originally built by a team at Google, led by Robert Griesemer, Rob Pike, and Ken Thompson. In November 2010, Go was launched publically as an open source project. Since then, a team at Google and more than 250 contributors from the open source community continued to improve the Go language, libraries, and tools.

# In March 2012, we announced Go 1, a version of the language and libraries that will be supported for years to come. 

* Getting started

* Install Go

.link http://golang.org/doc/install

- Install from binary distributions or build from source
- 32- and 64-bit x86 and ARM processors
- Windows, Mac OS X, Linux, and FreeBSD
- Other platforms may be supported by `gccgo`

# Go is available in binary form for Windows, Mac OS X, Linux, and FreeBSD running under 32 and 64-bit x86 processor architectures. To install Go on these systems, download the appropriate file from golang.org and either open the package installer (Windows or OS X) or extract the archive to /usr/local/go (Linux and FreeBSD).  

# If you use a different operating system or processor architecture, you may still be able to use Go by building it from source or using gccgo (an alternate Go compiler based on the GNU C Compiler). See the installation instructions on golang.org for how to do this.

* Test your Go installation

# Let's build and run a simple Go program to check that we have a valid Go install. Create a file named hello.go somewhere convenient and populate it with this Go source code:

Put this code into `hello.go`:

.code tutorial/hello.go

# Now, from a command prompt, run `go run hello.go`. This will build your program, storing the executable binary in a temporary location, and run it. You should see the greeting printed to the console.

Run the program:

  $ go run hello.go


* The go tool

The `go` tool is the standard tool for building, testing, and installing Go programs.

Compile and run `hello.go`:

  $ go run hello.go

Run `zip` tests:

  $ go test archive/zip

Build and format the files in the current directory:

  $ go build
  $ go fmt

Fetch and install `websocket`:

  $ go get code.google.com/p/go.net/websocket 


* Workspaces

The `go` tool derives build instructions from Go source code.

There's no need to write and maintain build scripts.

For this to work, some prescribed directory structure, known as a workspace, is required.

  workspace/
    bin # executable binaries
    pkg # compiled object files
    src # source code

* Create a workspace

Create your workspace now.

#I prefer to use the name "gocode", but you can use whatever you like.

  $ mkdir -p $HOME/gocode/src

(The `bin` and `pkg` sub-directories will be created by the `go` tool.)

Tell the `go` tool where your workspace is by setting the `GOPATH` environment variable:
# You can do this on OS X, Linux, and FreeBSD by adding this line to the `$HOME/.profile` and re-starting any running shells:

  export GOPATH=$HOME/gocode

# See the installation instructions at golang.org for how to set `GOPATH` under Windows.

You may also want to add the `bin` sub-directory of your workspace to your `PATH`:

  export PATH=$PATH:$GOPATH/bin

This lets you run your Go programs without specifying their full path.

(You may want to put these `export` commands in the `.bash_profile` file in your home directory.)

* Choose a namespace

Choose a special place for your Go code.

I use `"github.com/nf"`, the root of my GitHub account (useful with `go get`).

# Once you have chosen a namespace, create the required paths inside the `src` directory of your workspace:

  $ mkdir -p $GOPATH/src/github.com/nf

Create a `hello` directory in your namespace and copy `hello.go` there:
  
  $ mkdir $GOPATH/src/github.com/nf/hello
  $ cp hello.go $GOPATH/src/github.com/nf/hello

Now you can build install the hello program with the `go` tool:

  $ go install github.com/nf/hello

This builds an executable named `hello`, and installs it to the `bin` directory of your workspace.

  $ $GOPATH/bin/hello
  Hello, fellow gopher


* Our project

* Our project

A command-line program that fetches and displays the latest headlines from the `golang` page on Reddit.
# (Reddit is a huge link aggregation site where people submit links and other people vote on and have discussions about them.)

The program will:
- make an HTTP request to the Reddit API,
- decode the JSON response into a Go data structure, and
- print each link's title, URL, and number of comments.

To get started, create directory inside your namespace called `reddit`:

  $ mkdir $GOPATH/src/github.com/nf/reddit
  
This is where you will put your Go source files.


* Make an HTTP request

This program makes an HTTP request to the Reddit API and copies its response to standard output.  Put this in a file named `main.go` inside your `reddit` directory.

.code tutorial/1get.go

# If you run it you should see a blob of JSON data, or an error message if something goes wrong.

# There's a lot going on here, so let's break it down. 


* Make an HTTP request: package statement

All Go code belongs to a package.

.code tutorial/1get.go /package/

Go programs begin with function `main` inside package `main`.


* Make an HTTP request: import statement

The import declaration specifies the file's dependencies.

.code tutorial/1get.go /import/,/\)/

Each string is an import path. It tells the Go tools where to find the package.

These packages are all from the Go standard library.


* Make an HTTP request: function declaration

.code tutorial/1get.go /func.main/,/^}/ HLfunc

This is a function declaration. The main function takes no arguments and has no return values.

* Make an HTTP request: http.Get

.code tutorial/1get.go /func.main/,/^}/ HLget

Call the `Get` function from the `http` package, passing the URL of the Reddit API as its only argument.

Declare two variables (`resp` and `err`) and give them the return values of the function call. (Yes, Go functions can return multiple values.) The `Get` function returns `*http.Response` and an `error` values.


* Make an HTTP request: error handling

.code tutorial/1get.go /func.main/,/^}/ HLerr

Compare `err` against `nil`, the zero-value for the built-in `error` type.

The `err` variable will be nil if the request was successful.

If not, call the `log.Fatal` function to print the error message and exit the program.

# I cannot overstate the importance of error checking. Disregard error values at your peril!


* Make an HTTP request: check status

.code tutorial/1get.go /func.main/,/^}/ HLstatus

Test that the HTTP server returned a "200 OK" response.

If not, bail, printing the HTTP status message ("500 Internal Server Error", for example).


* Make an HTTP request: copy

.code tutorial/1get.go /func.main/,/^}/ HLcopy

Use `io.Copy` to copy the HTTP response body  to standard output (`os.Stdout`).

#On the left is a variable assignment that stores the error return value of the Copy in err. Note that this is different to the previous assignment which was also a declaration. This simple assignment - distinguished by the absence of a colon - assigns the second return value of the Copy to the err variable. The first return value, which appears to be assigned to an underscore, is thrown away. The underscore can be thought of as a "write only variable".

  package io

  func Copy(dst Writer, src Reader) (written int64, err error)

The `resp.Body` type implements `io.Reader` and `os.Stdout` implements `io.Writer`.


* Decoding the JSON response

* Data structures

The Reddit API returns JSON data like this:

  {"data": {"children": [
    {"data": {
      "title": "The Go homepage",
      "url": "http://golang.org/",
      ...
    }},
    ...
  ]}}

Go's `json` package decodes JSON-encoded data into native Go data structures. To decode the API response, declare some types that reflect the structure of the JSON data:

.code tutorial/2json.go /type.Item/,$


* Decode the response

Instead of copying the HTTP response body to standard output

.code tutorial/1get.go /io.Copy/

we use the json package to decode the response into our Response data structure.

.code tutorial/2json.go /new.Response/,/json.NewDecoder/

Initialize a new `Response` value, store a pointer to it in the new variable `r`.

Create a new `json.Decoder` object and decode the response body into `r`.

As the decoder parses the JSON data it looks for corresponding fields of the same names in the `Response` struct. The `"data"` field of the top-level JSON object is decoded into the `Response` struct's `Data` field, and JSON array `"children"` is decoded into the `Children` slice, and so on.


* Print the data

    for _, child := range r.Data.Children {
      fmt.Println(child.Data.Title)
    }

Iterate over the `Children` slice, assigning the slice value to `child` on each iteration.

The `Println` call prints the item's `Title` followed by a newline.


* Tidying up

* Separation of concerns

So far, all the action happens in the main function.

As the program grows, structure and modularity become important.

What if we want to check several subreddits? Or share this functionality with another program?

Create a function named `Get` that takes the name of subreddit, makes the API call, and returns the items from that subreddit.

.code tutorial/3func.go /func.Get/

`Get` takes a string, `reddit`, and returns a slice of `Item` and an `error` value.

* Get: construct the URL

.code tutorial/3func.go /func.Get/,/^}/ HLurl

Use `fmt.Sprintf` to construct the request URL from the provided `reddit` string.

* Get: return

.code tutorial/3func.go /func.Get/,/^}/ HLreturn

Exiting the function, return a nil slice and a non-nil error value, or vice versa.

* Get: making an error

.code tutorial/3func.go /func.Get/,/^}/ HLerrors

The response's `Status` field is just a string; use the `errors.New` function to convert it to an `error` value.

* Get: defer clean-up work

.code tutorial/3func.go /func.Get/,/^}/ HLclose

Defer a call to the response body's `Close` method, to guarantee that we clean up after the HTTP request. The call will be executed after the function returns.

# It's important to Close the response Body, because it tells the http package that you have finished reading, freeing up the HTTP connection to for re-used (the Go http package uses Keep-Alive and connection pooling by default). If we want to use our Get function in the context of a larger program, it must clean up properly.

# TODO(adg): about defer

* Get: prepare the response

.code tutorial/3func.go /func.Get/,/^}/ HLprepare

Use the make function to allocate an `Item` slice big enough to store the response data.

* Get: convert the response

.code tutorial/3func.go /func.Get/,/^}/ HLconvert

Iterate over the response's `Children` slice, assigning each child's `Data` element to the corresponding element in the items slice.

* Use Get in main

In the `main` function, replace the http request and JSON decoding code with a single call to `Get`.

.code tutorial/3func.go /func.main/,/^}/

The print loop becomes clearer, too.

However, it's not very useful to print only the title of the items. Let's address that.


* Formatted output

* The Stringer interface

The `fmt` package knows how to format the built-in types, but it can be told how to format user-defined types, too.

When you pass a value to the `fmt.Print` functions, it checks to see if it implements the `fmt.Stringer` interface:

  type Stringer interface {
    String() string
  }

Any type that implements a `String() string` method is a `Stringer`, and the `fmt` package will use that method to format values of that type.


* Formatting Items

A method declaration is just like a function declaration, but the receiver comes first.

Here's a `String` method for the `Item` type that returns the title, a newline, and the URL:

  func (i Item) String() string {
    return fmt.Sprintf("%s\n%s", i.Title, i.URL)
  }

To print the item we just pass it to Println, which uses the provided `String` method to format the `Item`.

  fmt.Println(item)


* Richer formatting (1/2)

Let's go a step further. One way to judge how interesting a link might be is by the discussion surrounding it. Let's display the number of comments for each `Item` as well.

  { "title": "The Go homepage",
    "url": "http://golang.org/",
    "num_comments": 10 }

Update the `Item` type to include a `Comments` field:

.code tutorial/4method.go /type.Item/,/^}/

The new `Comments` field has a "struct tag", a string that annotates the field. Go code can use the `reflect` package to inspect this information at runtime.

This tag, `json:"num_comments"`, tells the `json` package to decode the `"num_comments"` field of the JSON object into the `Comments` field (and the reverse, when encoding).

* Richer formatting (2/2)

Now the `String` method can be a little more complex:

.code tutorial/4method.go /func..i.Item..String/,/^}/

Observe that, unlike some languages, Go's switch statements do not fall through by default.

Now when we run our program we should see a nicely formatted list of links.


* Packages

* A new package (1/3)

This is useful code. Let's organize it to make it more accessible to others by putting it in an importable package.

Create a new directory inside your `reddit` directory named `geddit`, and copy your `main.go` file there.

`reddit` is the name of the library and `geddit` as that of the command-line client.

  $ cd $GOPATH/src/github.com/nf/reddit
  $ mkdir geddit
  $ cp main.go geddit/

Rename the `main.go` inside the `reddit` directory to `reddit.go`. (Not necessary; just a convention.)

  $ mv main.go reddit.go


* A new package (2/3)

Change the package statement at the top of `reddit.go` from `package main` to `package reddit`.

It is convention that the package name be the same as the last element of the import path.

The convention makes packages predictable to use:

  import "github.com/nf/reddit"

  func foo() {
    r, err := reddit.Get("golang") // "reddit" here is the package name
    // ...
  }

The only strict requirement is that it must not be `package main`.

Also remove the `main` function from `reddit.go`, and any unused package imports. (The compiler will tell you which packages are unused.)


* A new package (3/3)

The `reddit.go` file now looks like this:

  package reddit
  
  import (
    // omitted
  )
  
  type Response struct {
    // omitted
  }
  
  type Item struct {
    // omitted
  }
  
  func (i Item) String() string {
    // omitted
  }
  
  func Get(reddit string) ([]Item, error) {
    // omitted
  }


* Using the reddit package

Edit the `geddit/main.go` file to remove the `Get`, `Item`, and `Response` declarations, import the `reddit` package, and use the `reddit.` prefix before the `Get` invocation:

.code tutorial/main.go


* Documentation

* Documentation (1/3)

`Godoc` is the Go documentation tool. It reads documentation directly from Go source files. It's easy to keep documentation and code in sync when they live together in the same place.

Here's our reddit package when viewed from `godoc`:

  $ godoc github.com/nf/reddit
  PACKAGE
  
  package reddit
      import "github.com/nf/reddit"
  
  FUNCTIONS
  
  func Get(reddit string) ([]Item, error)
  
  TYPES
  
  type Item struct {
      Title    string
      URL      string
      Comments int `json:"num_comments"`
  }
  
  func (i Item) String() string

  type Response struct {
  	// etc

# Here we see all our top-level declarations. This is our package's user interface (not to be confused with an interface type). Despite the lack of documentation, the one thing that jumps out at me is the Response type. This is an implementation detail, and not something that a user of this package should need to see.

# In Go, top-level declarations beginning with an uppercase letter are "exported", and therefore visible outside the package. All other names are private and inaccessible to code outside the package. We can hide the Response type by simply renaming it to "response".

* Documentation (2/3)

First, hide the `Response` type by renaming it to `response`.

In Go, top-level declarations beginning with an uppercase letter are "exported" (visible outside the package). All other names are private and inaccessible to code outside the package.

To document the remaining visible names, add a comment directly above their declarations:

.code tutorial/reddit/reddit.go /Item.describes/,/type/

.code tutorial/reddit/reddit.go /Get.fetches/,/func/

# It is the convention to begin godoc comments with the noun they describe. This allows the text to be displayed in a variety of contexts, not necessarily alongside the declaration itself.

Most importantly, document the package itself by adding a comment to the package clause:

.code tutorial/reddit/reddit.go /Package.reddit/,/package.reddit/

Don't worry about documenting the `String` method, as all Go programmers should be familiar with it and its purpose.

* Documentation (3/3)

The `godoc` output for our revised package:

  PACKAGE
  
  package reddit
      import "github.com/nf/reddit"
  
      Package reddit implements a basic client for the Reddit API.
  
  FUNCTIONS
  
  func Get(reddit string) ([]Item, error)
      Get fetches the most recent Items posted to the specified subreddit.
  
  TYPES
  
  type Item struct {
      Title    string
      URL      string
      Comments int `json:"num_comments"`
  }
      Item describes a Reddit item.
  
  func (i Item) String() string

# You can also see how it will look on the web by running a local godoc instance

#   $ godoc -http=localhost:8080

# and loading http://localhost:8080/ in your browser.


* Sharing your work

* Publish the reddit library

- Add a copyright notice to each file
- Choose your preferred license
- Initialize the source control repo
- Make your first commit
- Push it to the remote repository


* Install with go get

Use the go tool to automatically check out and install Go code:

  $ go get github.com/nf/reddit/geddit

This checks out the repository to `$GOPATH/src/github.com/nf/reddit` and installs the binary to `$GOPATH/bin/geddit`. The `bin` directory is in my PATH, so I can now run:

  $ geddit

The `go get` command can fetch code from

- Bitbucket
- GitHub
- Google Code
- Launchpad

as well as arbitrary Git, Mercurial, Subversion, and Bazaar repositories.


* Homework

Some ideas:

- Implement a command-line interface to specify the subreddit(s) to query.
- Expand the reddit package to support more of the Reddit API.
- Learn about Go's concurrency primitives and perform multiple requests in parallel.


* Where to go from here

Learn Go:

.link http://tour.golang.org 

Documentation and articles:

.link http://golang.org/doc

Standard library reference:

.link http://golang.org/pkg

