The State of Go Where we are in June 2014 Andrew Gerrand

Yesterday 2

Initial reception Looking back on the first months. 3

Complaints The complaints started right away… 4

Familiar complaints 5

Familiar complaints The first HN thread about Go was mostly an argument about braces and indentation. 6

Historic moments The first public language change (Dec 10, 2009): 7

The gopher 8

The gopher 9

The gopher 10

A keen observation 11

Signs of hope 12

Today 13

Growth 14

User groups Today there are 48 active user groups in 15 countries across 5 continents. 15

GopherCon Community-driven. 3 days. 700 attendees. 24 talks. 1 panel. 4 hours of lightning talks! 16

The gopher 17

The gopher 18

The gopher 19

Go 1.3 Released last Wednesday, 18 June 2014. Highlights: Native Client support (amd64, 386)

DragonFly BSD, Plan 9, and Solaris support

Improved performance (GC, contiguous stacks, race detector, regexp)

Faster incremental builds (linker overhaul)

Precise GC of stacks

Static analysis in godoc 20

Tomorrow 21

Upcoming conferences 22

Go 1.4 Due December 1st, 2014. What might be in it? (Speculative list follows.) 23

New language features Nope. 24

Canonical import paths A means for a repository to specify its canonical import path. Goal: stop people from checking out repos from the wrong path. Applications: Stable vanity import paths. "camlistore.org" -> "camlistore.googlesource.com/camlistore" Make GitHub's fork model less painful. (Proposal forthcoming.) 25

Internal packages Current proposal: "An import of a path containing the element “internal” is disallowed if the importing code is outside the tree rooted at the parent of the “internal” directory." Code in /a/b/c/internal/d/e/f can be imported only by code in the directory tree rooted at /a/b/c .

can be imported only by code in the directory tree rooted at . $GOROOT/src/pkg/internal/xxx can be imported only by other code in the standard library ( $GOROOT/src/ ). And, later: $GOPATH/src/mypkg/internal/foo can be imported only by code in $GOPATH/src/mypkg . golang.org/s/go14internal 26

src/pkg → src Move the standard library from $GOROOT/src/pkg to $GOROOT/src . Basically makes $GOROOT work just like $GOPATH . (Not a big deal for most, but a nice clean up for the core.) golang.org/s/go14nopkg 27

File system access throttling Throttling of access to the file system at the os package level. Goal: Launch a million goroutines that do file system stuff.

Don't launch a million operating system threads to block on the syscalls. Make it work just as nicely as it does with the network. (Proposal forthcoming.) 28

"go generate" A convenience for generating Go source code. Example uses: yacc: generating .go files from yacc grammar (.y) files

protobufs: generating .pb.go files from protocol buffer definition (.proto) files

HTML: embedding .html files into Go source code

Other ideas abound… Proposed mechanism: Add generator directive in Go source files: //go:generate yacc -o gopher.go gopher.y Use the Go tool to execute the directives: % go generate [packagepath] (Proposal forthcoming.) 29

More tool chain work cmd/go support for gccgo

support for cmd/go support for embedded data files

support for embedded data files Race detector improvements The transition from C to Go continues: Linker rewritten in Go ( cmd/link )

) Assembler rewritten in Go ( cmd/asm )

) Possibly: cmd/gc translated to Go 30

Better GC and malloc The existing allocator is based on TCMalloc (designed for C/C++). It can be re-designed to better suit Go.

Lighter representation and colocation of GC metadata.

Various strategies for reducing GC pause time (concurrent sweep, etc). Rough estimate: 10-20% overall speedup, 20-50% GC pause reduction, 5-10% RSS reduction. Details: golang.org/s/go14mallocgc 31

Other runtime changes Concurrency improvements: Lock-free fast path for non-blocking receive from empty channel.

Rewrite select to hold only one channel lock at a time. C to Go: G-stack runtime converted to Go. 32

Package changes Easier structuring features in text/template

Bring reflect.Value back to 3 words

back to 3 words Fix embedded field visibility ( reflect )

) Safe version of encoding/gob

Unicode 7 support 33

Ports Native Client arm

PowerPC 64

ARM64 34

Go support for Android Go support for the NDK. (Like C/C++ today, but better!) Goal: enough support for writing games. Based on the work of Elias Naur and others in the community. golang.org/s/go14android 35

More golang.org/s/go14todo 36

Questions? 37