| # 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). |