Go: a simple programming environment

9 Nov 2012

# Go is a general-purpose language that bridges the gap between efficient
# statically typed languages and productive dynamic language. But it’s not just
# the language that makes Go special – Go has broad and consistent standard
# libraries and powerful but simple tools.
# 
# This talk gives an introduction to Go, followed by a tour of some real
# programs that demonstrate the power, scope, and simplicity of the Go
# programming environment.

Andrew Gerrand
Google Inc.
@enneff
adg@golang.org
http://golang.org

* Video

A video of this talk was recorded at Øredev in Malmö, Sweden in November 2012.

.link http://vimeo.com/53221558 Watch the talk on Vimeo

* Background

* Why a new language?

Motivated by our needs at Google.

We need:

- Efficiency
- Safety
- Concurrency
- Scalability
- Fast development cycle
- No surprises
- A cute mascot

* Design

"Consensus drove the design. Nothing went into the language until [Ken Thompson, Robert Griesemer, and myself] all agreed that it was right. Some features didn’t get resolved until after a year or more of discussion." - Rob Pike

Go is:

- Lightweight, avoids unnecessary repetition
- Object Oriented, but not in the usual way
- Concurrent, in a way that keeps you sane
- Designed for working programmers

* Go 1

Released in March 2012

A specification of the language and libraries that will be supported for years.

The guarantee: code written for Go 1.0 will build and run with Go 1.x.

Best thing we ever did.

* The gopher

.image simple/gopher.jpg

* Hello, go

.play simple/hello.go

* Standard library

* Packages

Go code lives in packages.

Packages contain type, function, variable, and constant declarations.

Packages can be very small (package `errors` has just one declaration) or very large (package `net/http` has >100 declarations). Most are somewhere in between.

Case determines visibility: `Foo` is exported, `foo` is not

* io

The `io` package provides fundamental I/O interfaces that are used throughout most Go code.

The most ubiquitous are the `Reader` and `Writer` types, which describe streams of data.

.code simple/io/io.go

`Reader` and `Writer` implementations include files, sockets, (de)compressors, image and JSON codecs, and many more.

* Chaining io.Readers

.play simple/reader.go

* net/http

The `net/http` package implements an HTTP server and client.

.play simple/hello-web.go

* encoding/json

The `encoding/json` package converts JSON-encoded data to and from native Go data structures.

.play simple/json.go /const/,$

* time

The `time` package provides a representation of time and duration, and other time-related functions.

.play simple/time.go /START/,/END/
.play simple/time2.go /START/,/END/

`time.Time` values also contain a `time.Location` (for display only):

.play simple/time3.go /START/,/END/

* flag

The `flag` package provides a simple API for parsing command-line flags.

.play simple/flag.go

	$ flag -message 'Hold on...' -delay 5m

* Tools

* The go tool

The `go` tool is the de facto standard for building and installing Go code.

Compile and run a single-file program:

	$ go run hello.go

Build and install the package in the current directory (and its dependencies):

	$ go install

Build and install the `fmt` package (and its dependencies):

	$ go install fmt

This tool also acts as an interface for most of the Go tools.

* Import paths

The `go` tool is a "zero configuration" tool. No Makefiles or scripts. Just Go code.
Your build schema and code are always in sync; they are one and the same.

Package import paths mirror the code's location in the file system:

  src/
    github.com/nf/
      gosynth/
        main.go
        note.go
        osc.go
      wav/
        writer.go

The `gosynth` program imports the `wav` package:

  import "github.com/nf/wav"

Installing `gosynth` will automatically install the `wav` package:

  $ go install github.com/nf/gosynth

* Remote dependencies

The `go` tool also fetches Go code from remote repositories.

Import paths can be URLs:

	import "code.google.com/p/go.net/websocket"

To fetch, build and install a package:

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

To fetch, build, and install `gosynth` and its dependencies:

	$ go get github.com/nf/gosynth

This simple design leads to other cool tools:

.link http://go.pkgdoc.org

* Godoc

Godoc extracts documentation from Go code and presents it in a variety of forms.

Comments need no special format, they just need to precede what they document.

	// Split slices s into all substrings separated by sep and returns a slice of
	// the substrings between those separators.
	// If sep is empty, Split splits after each UTF-8 sequence.
	// It is equivalent to SplitN with a count of -1.
	func Split(s, sep string) []string {

.image simple/split.png

Documentation that lives with code is easy to keep up-to-date.

* Gofmt

The `gofmt` tool is a pretty-printer for Go source code.

All Go code in the core is gofmt'd, as is ~70% of open source Go code.

Ends boring formatting discussions.

Improves readability. Improves writability.

Saves a _huge_ amount of time.

* Tests: writing

The `go` tool and the `testing` package provide a lightweight test framework.

.code simple/test/string_test.go /func TestIndex/,/^}/

* Tests: running

The go tool runs tests.

	$ go test
	PASS

	$ go test -v
	=== RUN TestIndex
	--- PASS: TestIndex (0.00 seconds)
	PASS

To run the tests for all my projects:

	$ go test github.com/nf/...

* Tests: benchmarks

The `testing` package also supports benchmarks.
	
A sample benchmark function:

.code simple/test/string_test.go /func BenchmarkIndex/,/^}/
 
The benchmark package will vary `b.N` until the benchmark function lasts long enough to be timed reliably.

	$ go test -test.bench=Index
	PASS
	BenchmarkIndex	50000000	        37.3 ns/op

* Tests: doc examples

The `testing` package also supports testable examples.

.code simple/test/string_test.go /func ExampleIndex/,/^}/

Examples and built and run as part of the normal test suite:

	$ go test -v
	=== RUN: ExampleIndex
	--- PASS: ExampleIndex (0.00 seconds)
	PASS

The example is displayed in `godoc` alongside the thing it demonstrates:

.link http://golang.org/pkg/strings/#Index

* And there's more

- `vet`: checks code for common programmer mistakes
- `pprof`: CPU and memory profiling
- `fix`: automatically migrate code as APIs change
- GDB support
- Editor support: Vim, Emacs, Eclipse, Sublime Text

* An example

* Webfront

`Webfront` is an HTTP server and reverse proxy.

It reads a JSON-formatted rule file like this:

.code simple/webfront/main.go /^\[/,/\]/

For all requests to the host `example.com` (or any name ending in `".example.com"`) it serves files from the `/var/www` directory.

For requests to `example.org`, it forwards the request to the HTTP server listening on localhost port 8080.

* The Rule type

A `Rule` value specifies what to do for a request to a specific host.

.code simple/webfront/main.go /Rule represents/,/^}/

It corresponds directly with the entries in the JSON configuration file.

.code simple/webfront/main.go /^\[/,/\]/

* Rule methods

.code simple/webfront/main.go /Match returns/,/^}/
.code simple/webfront/main.go /Handler returns/,/^}/

* The Server type

The `Server` type is responsible for loading (and refreshing) the rules from the rule file and serving HTTP requests with the appropriate handler.

.code simple/webfront/main.go /Server implements/,/^}/
.code simple/webfront/main.go /ServeHTTP matches/,/^}/

* The handler method

.code simple/webfront/main.go /handler returns/,/^}/

* Parsing rules

The `parseRules` function uses the `encoding/json` package to read the rule file into a Go data structure.

.code simple/webfront/main.go /parseRules reads/,/^}/

* The loadRules method

.code simple/webfront/main.go /loadRules tests/,/^}/

* Constructing the server

.code simple/webfront/main.go /NewServer constructs/,/^}/

This constructor function launches a goroutine running the `refreshRules` method.

* Refreshing the rules

.code simple/webfront/main.go /refreshRules polls/,/^}/

* Bringing it all together

The main function parses command-line flags, constructs a `Server`, and launches an HTTP server that serves all requests with the `Server`.

.code simple/webfront/main.go /^var/,/^}/

* Demo

* Testing (1/3)

The `Server` integration test uses the `httptest` package to construct a dummy HTTP server, synthesizes a set of rules, and constructs a `Server` instance that uses those rules.

.code simple/webfront/server_test.go /^func testHandler/,/STOP/

* Testing (2/3)

Each test case in the table specifies a request URL and the expected response code and body.

.code simple/webfront/server_test.go /TESTS START/,/STOP/

* Testing (3/3)

For each test case, construct an `http.Request` for the url and an `httptest.ResponseRecorder` to capture the response, and pass them to the `Server.ServeHTTP` method. Then check that the response matches the test case.

.code simple/webfront/server_test.go /RANGE START/,/^}/

* Demo

* Conclusions

* Further reading

All about Go:

.link http://golang.org

The slides for this talk:

.link http://talks.golang.org/2012/simple.slide

webfront:

.link https://github.com/nf/webfront

