The State of Go
Where we are in May 2015
27 May 2015

Andrew Gerrand
adg@golang.org


* The State of the State of Go

I gave a similar talk at FOSDEM in February 2015.

.link https://talks.golang.org/2015/state-of-go.slide

This talk builds on that talk.


* Go 1.5


* Release schedule

Go 1.5 is scheduled for release in August 2015.

The major work is done.
We are now in the "feature freeze" period.


* From C to Go

The `gc` tool chain has been converted from C to Go.

Machine-translated `compile` tool replaces `6g`, `8g`, etc.
Machine-translated `link` tool replaces `6l`, `8l`, etc.
New `asm` tool replaces `6a`, `8a`, etc.

Go 1.5 has *no* C code in the tool chain or runtime.

Rob will talk more about this.


* Concurrent Garbage Collector

Goals:

- Limit GC latency to less than 10 milliseconds.
- Run Go application code for at least 40ms out of every 50ms.

.image state-of-go-may/gc.png

.link https://golang.org/s/go14gc


* Concurrent GC trade-offs

The new GC spends a little more memory and CPU time
in exchange for significantly shorter GC pause times.

.image state-of-go-may/gc2.png


* Better concurrency performance

Setting `GOMAXPROCS=N` (where `N` is your number of CPUs) works well in Go 1.5.

Better performance executing goroutines in parallel:

.image state-of-go-may/conc-sieve.png _ 800

Better perfomance switching between goroutines in serial:

.image state-of-go-may/conc-chain.png _ 800


* Better concurrency performance (bottom line)

Better performance under practical workloads:

.image state-of-go-may/conc-practical.png _ 800

And our benchmark suite:

.image state-of-go-may/conc-bench.png _ 500


* Go 1.5 overall performance 

.image state-of-go-may/gcperf.png


* Go 1.5 overall performance (continued)

.image state-of-go-may/perfchart.png


* OS/Arch ports

Go 1.5 supports some new `GOOS/GOARCH` combinations:

- `darwin/arm`, a.k.a iOS
- `darwin/arm64` (newer iDevices)
- `linux/arm64` (cgo is supported, but only with external linking)
- `openbsd/arm` (no cgo or external linking)

And retires some old ones:

DragonflyBSD dropped support for i386; `dragonfly/386` was removed from Go.

Apple no longer supports OS X 10.6 (no security updates since 2013);
the Go port to OS X 10.6 (Snow Leopard) is no longer actively maintained.


* Shared libraries

Go 1.5 can produce Go shared libraries that can be consumed by Go programs.

Build the standard library as shared libraries:

	$ go install -buildmode=shared std

Build a "Hello, world" program that links against the shared libraries:

	$ go build -linkshared hello.go
	$ ls -l hello
	-rwxr-xr-x 1 adg adg 13926 May 26 02:13 hello


Go 1.5 can also build Go programs as C archive files (for static linking)
or shared libraries (for dynamic linking) that can be consumed by C programs.

.link https://golang.org/s/execmodes

(Demo)


* Go programs as C libraries

Given a package:

	package p // import "p"

	import "C"

	//export Foo
	func Foo() int32 { return 42 }

And a main package that imports it:

	package main // import "m"

	import _ "p"

	func main() {} // ignored

You can build an archive file that can be linked into a C program:

	$ go build -buildmode=c-archive m
	$ ls $GOPATH/pkg/linux_amd64
	m.a  p.a  p.h


* A minor language change

You may now omit the key type from a map literal.

This map literal

	m := map[Point]string{
		Point{29.935523, 52.891566}:   "Persepolis",
		Point{-25.352594, 131.034361}: "Uluru",
		Point{37.422455, -122.084306}: "Googleplex",
	}

may now be written as:

	m := map[Point]string{
		{29.935523, 52.891566}:   "Persepolis",
		{-25.352594, 131.034361}: "Uluru",
		{37.422455, -122.084306}: "Googleplex",
	}


* "go doc"

The `go` tool has a new implementation of the old `doc` subcommand,
with a much improved command-line interface:

	$ go doc zip.reader
	package zip // import "archive/zip"

	type Reader struct {
		File    []*File
		Comment string
		// Has unexported fields.
	}

	func NewReader(r io.ReaderAt, size int64) (*Reader, error)

	$ cd $GOROOT/src/archive/zip
	$ go doc reader
	# same output as above

(Demo)


* Execution tracing

The new execution tracer collects data to produce diagrams of process execution.

.image state-of-go/trace.png 350 _

Front end is the Android/Chrome trace-viewer. ([[https://github.com/google/trace-viewer][github.com/google/trace-viewer]])

.link http://golang.org/s/go15trace


* Analysis and Refactoring Tools

We have been working on tools for analyzing and manipulating Go source code.

Analysis tools:

- `oracle`: a tool for answering questions about Go source code (w/ plugins for Sublime Text and Emacs).
- `callgraph`: display the call graph of a Go program.
- `godoc`-analysis=pointer:` see pointer analysis details in godoc.

Refactoring tools:

- `eg`: a template-based refactoring tool
- `gorename`: type-safe renaming of identifiers in Go source code.


* Builder infrastructure

We have been hacking away at our continuous build infrastructure.

Now running Linux, Windows, OS X, FreeBSD, OpenBSD, and Plan 9 builders
on Google Compute Engine.

Spin up builders to do work, spin up many in parallel.
Gives us results much faster.

Sharding of tests on slower platforms (eg, ARM).

Trybots test pending changes. (Demo)


* Mobile

Go 1.5 provides support for Android and experimental support for iOS.

.image state-of-go-may/iphone.jpg 500 _


* The gomobile tool

The `gomobile` tool simplifies toolchain installation and app
deployment.
(It only supports Android right now.)

To install the Android compiler toolchain:

	$ gomobile init

To build an Android APK and install on a device:

	$ gomobile install

To build a shared library for an Android or iOS app:

	$ gomobile bind

(Demo)


* Go community events

- GoCon, Tokyo, June
- GopherCon, Denver, July
- GolangUK, London, August
- GothamGo, New York, October
- dotGo, Paris, November

And more to be announced.

.image state-of-go-may/gophercon.png


