The Go programming language has been updated to version 1.7, bringing with it many performance and compile-time speedups. A new compiler back-end has been added, based on static single-assignment form, and according to Google, this addition can bring speedups to applications ranging from 5% to 35%.
The compiler improvements don’t end with actual application optimizations, either. The Go team claimed to have seen significant speed increases in compile time, as well as a 20% to 30% reduction in the compiled binaries’ sizes. All of these benefits are currently only available on AMD64 architectures, but the Go team plans to spread support to other architectures in the future.
Go 1.7 is also the first version of the language to support Linux on IBM z Systems. This support is still considered experimental, and is accompanied by the beginnings of a port to Plan 9 on ARM. Go 1.7 also offers support for macOS Sierra.
(Related: Google intros machine learning APIs)
Inside the language, the context package has been merged into the standard library. This move is accompanied by more extensive support for contexts within the net, net/http, and os/exec packages.
Go 1.5 introduces the concept of vendor directories. In version 1.6, vendor directories were turned on by default, which enabled external dependencies to satisfy imports of those dependencies. In version 1.7, vendor dependencies are no longer an option and cannot be turned off.
Another big change in Go 1.7 is the inclusion of a new binary format for exported metadata written by the compiler in package archives. This new binary format makes packages smaller and fixes a few bugs.
On x86-64 systems, Go programs now maintain stack frame pointers in a manner that is expected by profiling tools’ line perf and Intel’s VTune. This makes it easier to analyze Go programs using these more traditional tools. This introduces a 2% performance overhead, but the Go team is hoping to reduce this cost in future releases.
Packages that use cgo, the Go-to-C bridge, can now use Fortran source files, in addition to C, C++, Objective-C and SWIG. Go bindings may now use the new helper function known as C.CBytes, which takes a Go byte and returns an unsafe.Pointer as a C void*.