DRAFT RELEASE NOTES - Introduction to Go 1.8

Go 1.8 is not yet released. These are work-in-progress release notes. Go 1.8 is expected to be released in February 2017.

The latest Go release, version 1.8, arrives six months after Go 1.7. Most of its changes are in the implementation of the toolchain, runtime, and libraries. There is one minor change to the language specification. As always, the release maintains the Go 1 promise of compatibility. We expect almost all Go programs to continue to compile and run as before.

The release adds support for 32-bit MIPS, updates the compiler back end to generate more efficient code, produces smaller binaries (TODO: link/numbers), reduces GC pauses by eliminating stop-the-world stack rescanning, adds HTTP/2 Push support, adds HTTP graceful shutdown, and simplifies sorting slices.

Changes to the language

When explicitly converting structs, tags are now ignored for structural type identity. See change 24190 for details.

Ports

Go now supports 32-bit MIPS on Linux for both big-endian (linux/mips) and little-endian machines (linux/mipsle).

Go now requires DragonFly BSD 4.4.4 or later.

The Plan 9 port's networking support is now much more complete and matches the behavior of Unix and Windows with respect to deadlines and cancelation.

Known Issues

There are some instabilities on FreeBSD that are known but not understood. These can lead to program crashes in rare cases. See issue 15658 and issue 16396. Any help in solving these FreeBSD-specific issues would be appreciated.

Tools

Assembler

For 64-bit x86 systems, the following instructions have been added: VBROADCASTSD, BROADCASTSS, MOVDDUP, MOVSHDUP, MOVSLDUP, VMOVDDUP, VMOVSHDUP, and VMOVSLDUP.

For 64-bit PPC systems, the common vector scalar instructions have been added. See change 30510.

Yacc

The yacc (previously available via “go tool yacc”) has been removed. As of Go 1.7 it was no longer used by the Go compiler. It has moved to the “tools” repo and is and is available via go get golang.org/x/tools/cmd/goyacc.

Compiler Toolchain

Go 1.7 introduced a new compiler back end for 64-bit x86 systems. In Go 1.8, that back end has been developed further and is now used for all architectures.

The new back end, based on SSA, generates more compact, more efficient code and provides a better platform for optimizations such as bounds check elimination. The new back end reduces the CPU time required by our benchmark programs by N-M%. TODO: ARM binary size & perf numbers.

The temporary -ssa=0 flag introduced in Go 1.7 to disable the new backend has been removed in Go 1.8.

The compiler and linker have been optimized and run faster in this release than in Go 1.7, although they are still slower than we would like and will continue to be optimized in future releases.

Due to changes across the compiler toolchain and standard library, binaries built with this release should typically be smaller than binaries built with Go 1.7, sometimes by as much as TODO numbers.

Cgo

TODO

Gccgo

TODO

Go command

The go command's basic operation is unchanged, but there are a number of changes worth noting.

A new “go bug” command helps users file bug reports.

Performance

As always, the changes are so general and varied that precise statements about performance are difficult to make. Most programs should run a bit faster, due to speedups in the garbage collector and optimizations in the core library.

There have been significant optimizations bringing more than 10% improvements to implementations in the TODO TODO: foo, bar, and quux packages.

Garbage Collector

Garbage collection pauses should be significantly shorter than they were in Go 1.7, often as low as 10 microseconds and usually under 100 microseconds. See the document on eliminating stop-the-world stack re-scanning for details. More work remains for Go 1.9.

Defer

defer calls are now about twice as fast.

Cgo

Calls from Go into C are now TODO% faster.

Core library

Examples

Many examples have been added to the documentation across many packages.

Sort

The sort package now includes a convenience function sort.Slice to sort a slice given a less function. In many cases this means that writing a new sorter type is not necessary.

Also new are sort.SliceStable and sort.SliceIsSorted.

HTTP/2 Push

The net/http package now includes a mechanism to send HTTP/2 server pushes from a Handler. Similar to the existing Flusher and Hijacker interfaces, an HTTP/2 ResponseWriter now implements the new Pusher interface.

HTTP Server Graceful Shutdown

Minor changes to the library

As always, there are various minor changes and updates to the library, made with the Go 1 promise of compatibility in mind.

foo

bar