The State of Go
Where we are in February 2015

Andrew Gerrand
adg@golang.org


* Go 1.4

Released in December 2014.

A few important things:

- Android support.
- Canonical import paths.
- The `go`generate` command.

Lots of behind-the-scenes work:

- Prep work for new garbage collector.
- Prep work for C to Go tool chain conversion.
- Source tree re-organization.

.link https://golang.org/doc/go1.4


* Transition to Git

* Transition to Git

In December we migrated the Go repositories from Mercurial to Git.

Also moved to new development infrastructure:

- googlesource.com replaces Google Code for repository hosting.
- Gerrit replaces Rietveld for code review.
- GitHub replaces Google Code for issue tracking and wiki.

A big deal for Go contributors, but not important to Go users.

.link https://go.googlesource.com
.link https://go-review.googlesource.com
.link https://github.com/golang/go


* Why Git?

- Gerrit and GitHub use Git.

Why Gerrit?

- Rietveld was unmaintained.
- Gerrit is actively maintained; used by Android and Chrome, among others.

Why GitHub?

- Puts us closer to our community.
- Other GitHub repos can more easily link to Go issues and commits.


* Transition pros and cons

Pros:

- More people understand Git than Mercurial.
- Contributors can use their own Git workflows.
- Good integration between Git and Gerrit. (Rietveld and Mercurial are separate.)
- Automated CLA checking.

Cons:

- Git has a steep learning curve.
- No way to disable pull requests.
- No way to "star" or +1 issues.
- The standard of issue reports has gone down. (No issue templates. Different culture.)
- The transition was a ton of work.


* Why not accept pull requests?

Coming from Gerrit, Rietveld, or Google's internal code review systems,
GitHub's pull request system is lacking.

- Can only view diffs on a single page (can be *very* slow).
- Comments are sent as they are written; you cannot "draft" comments.
- Cannot compare differences between patch sets.
- To create a patch one must fork the repository publicly (weird and unnecessary).
- Accepting a patch creates a "merge commit" (ugly repo history).
- In general, pull request culture is not about code review.


* Go 1.5


* Change to release cycle

Go 1.5 is scheduled for release in August 2015 (was June).

(Previous cycle clashed with holidays and other calendrical events.)


* From C to Go

The `gc` tool chain is being converted from C to Go.

An ongoing process, started early 2014.
Russ Cox says "It'll be done by March [2015]."

New `link` tool to replace `6l`, `8l`, etc.
New `asm` tool to replace `6a`, `8a`, etc.
Machine-translated `gc` to replace `6g`, `8g`, etc.

Design doc:

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

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


* Compiling Go 1.5

You will need Go 1.4 to build Go 1.5 and above.

(But you will not need a C compiler!)

As a user, put Go 1.4 in `$HOME/go1.4` (or set `$GOROOT_BOOTSTRAP`).

New OS or architecture ports will need to cross-compile.

Design doc:

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

If you use a binary distribution of Go, you don't need to do anything.


* Concurrent Garbage Collector

Work began on a new, concurrent GC during the Go 1.4 dev cycle.

Goal:

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

On track for Go 1.5.

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


* HTTP/2

Brad Fitzpatrick has implemented an `HTTP/2` server for Go.

Will be in the standard library by Go 1.soon.

Go servers that use `net/http` will get `HTTP/2` for free.

Currently in Brad's GitHub:

.link https://github.com/bradfitz/http2

See it in action:

.link https://http2.golang.org


* Mobile

David Crawshaw, Hana Kim, Minux, and Burcu Dogan have been working on Go for
mobile devices.

Can build Android apps with Go 1.4
(if you can work out the Android build system).

For Go 1.5:

- Simpler build story for Android.
- More NDK library support.
- Better bindings for calling Go from Java.
- Beginnings of iOS support. (New `darwin/arm` build target.)


* New architectures

Go 1.5 will support PowerPC 64 and (maybe) ARM64.

PowerPC 64 is basically done; builder running, passes tests.

ARM64 development ongoing.
Hope to have a dev.arm64 branch in the main repo for Go 1.5.
Stretch goal is merging it into master.

See work in progress for ARM64 here:

.link https://github.com/4ad/go


* Execution tracing

Dmitry Vyukov has implemented a `trace` tool.
It 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

Alan Donovan and others have been working on a tools for analyzing and
manipulating Go source code.

Available in the `tools` repo:

- `callgraph`: display the call graph of a Go program.
- `gomvpkg`: moves go packages, updating import declarations.
- `gorename`: type-safe renaming of identifiers in Go source code.

Coming soon:

- `sockdrawer`: a tool for automatically splitting packages.


* Builder infrastructure

Brad Fitzpatrick and Andrew Gerrand have been hacking away at our continuous
build infrastructure.

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

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

Up next: trybots to test pending changes.

Also: gomote! (Demo)


* The Go Community


* Conferences in 2015

- FOSDEM, Brussels, now!
- GopherCon India, Bengaluru, February
- GoCon, Tokyo, Spring and Autumn
- GopherCon, Denver, July
- dotGo, Paris, November

More to be announced.


* Gopher Gala

A global Go hackathon, in January 2015 (last week).

.image state-of-go/gala.jpg 200 _

Teams compete to produce Go apps, judged by "usefulness, creativity, completeness, and how well they showcase Go's strengths."

Also physical hackathons around the world: from San Francisco to Stockholm to Tokyo.

Cool prizes, including a Chromebook Pixel, a Raspberry Pi, and a trip to Colima, Mexico.

The [[http://gophergala.com/blog/gopher/gala/2015/02/03/winners/][winners have been announced]].



* Go user groups

Lots of Go meetups popping up all over the world.

Find one near you:

.link https://go-meetups.appspot.com

