blob: 4ee94cc24e11320ef51c2fbea4c9a286da5f291b [file] [log] [blame]
# Go 1.9 is released
24 Aug 2017
Summary: Go 1.9 adds type aliases, bit intrinsics, optimizations, and more.
Francesc Campoy
campoy@golang.org
##
Today the Go team is happy to announce the release of Go 1.9.
You can get it from the [download page](https://golang.org/dl/).
There are many changes to the language, standard library, runtime, and tooling.
This post covers the most significant visible ones.
Most of the engineering effort put into this release went to improvements of the runtime and tooling,
which makes for a less exciting announcement, but nonetheless a great release.
The most important change to the language is the introduction of type aliases: a feature
created to support gradual code repair. A type alias declaration has the form:
type T1 = T2
This declaration introduces an alias name `T1` for the type `T2`, in the same way that `byte` has
always been an alias for `uint8`.
The [type alias design document](https://golang.org/design/18130-type-alias) and
[an article on refactoring](https://talks.golang.org/2016/refactor.article) cover this addition in more detail.
The new [math/bits](https://golang.org/pkg/math/bits) package provides bit counting and manipulation functions
for unsigned integers, implemented by special CPU instructions when possible.
For example, on x86-64 systems, `bits.TrailingZeros(x)` uses the
[BSF](https://pdos.csail.mit.edu/6.828/2010/readings/i386/BSF.htm) instruction.
The `sync` package has added a new [Map](https://golang.org/pkg/sync#Map) type, safe for concurrent access.
You can read more about it from its documentation and learn more about why it was created from this
[GopherCon 2017 lightning talk](https://www.youtube.com/watch?v=C1EtfDnsdDs)
([slides](https://github.com/gophercon/2017-talks/blob/master/lightningtalks/BryanCMills-AnOverviewOfSyncMap/An%20Overview%20of%20sync.Map.pdf)).
It is not a general replacement for Go's map type; please see the documentation to learn when it should be used.
The `testing` package also has an addition. The new `Helper` method, added to both
[testing.T](https://golang.org/pkg/testing#T.Helper) and [testing.B](https://golang.org/pkg/testing#B.Helper),
marks the calling function as a test helper function.
When the testing package prints file and line information, it shows the location of the call to a helper function
instead of a line in the helper function itself.
For example, consider this test:
.code go1.9/helper_test.go /package p/,
Because `failure` identifies itself as a test helper, the error message printed during `Test` will indicate line 11,
where `failure` is called, instead of line 7, where `failure` calls `t.Fatal`.
The `time` package now transparently tracks monotonic time in each `Time` value,
making computing durations between two `Time` values a safe operation in the presence of wall clock adjustments.
For example, this code now computes the right elapsed time even across a leap second clock reset:
start := time.Now()
f()
elapsed := time.Since(start)
See the [package docs](http://beta.golang.org/pkg/time/#hdr-Monotonic_Clocks) and
[design document](https://github.com/golang/proposal/blob/master/design/12914-monotonic.md) for details.
Finally, as part of the efforts to make the Go compiler faster, Go 1.9 compiles functions in a package concurrently.
Go 1.9 includes many more additions, improvements, and fixes. Find the complete set of changes,
and more information about the improvements listed above, in the
[Go 1.9 release notes](https://golang.org/doc/go1.9).
To celebrate the release, Go User Groups around the world are holding
[release parties](https://github.com/golang/cowg/blob/master/events/2017-08-go1.9-release-party.md).