> Source: https://www.ymotongpoo.com/works/goblog-ja/go1.9/


# Go 1.9 のリリース

[Go 1.9 is released](https://go.dev/blog/go1.9) by Francesc Campoy

本日、Goチームは Go 1.9 のリリースを発表できることを嬉しく思います。[ダウンロードページ](https://go.dev/dl/)から入手できます。
言語、標準ライブラリ、ランタイム、ツールチェインには多くの変更が加えられています。この記事ではその中でも特に目立つ変更を取り上げます。
今回のリリースに注がれたエンジニアリングの労力の大部分はランタイムとツールチェインの改善に向けられており、そのため発表としては
地味なものになっていますが、それでも素晴らしいリリースであることに変わりありません。

言語における最も重要な変更は、型エイリアスの導入です。これは段階的なコード修正をサポートするために作られた機能です。
型エイリアス宣言は次の形を取ります。

```go
type T1 = T2
```

この宣言は、 `byte` がこれまでずっと `uint8` のエイリアスであったのと同じように、型 `T2` に対してエイリアス名 `T1` を
導入します。この追加機能の詳細については、[型エイリアスの設計ドキュメント](https://go.dev/design/18130-type-alias)と
[リファクタリングに関する記事](https://go.dev/talks/2016/refactor.article)で解説しています。

新しい [math/bits](https://pkg.go.dev/math/bits) パッケージは、符号なし整数に対するビットカウントや操作のための関数を
提供します。可能な場合には専用のCPU命令を使って実装されています。たとえばx86-64システムでは、
`bits.TrailingZeros(x)` は [BSF](https://pdos.csail.mit.edu/6.828/2010/readings/i386/BSF.htm) 命令を使用します。

`sync` パッケージには、並行アクセスに対して安全な新しい [Map](https://pkg.go.dev/sync#Map) 型が追加されました。
詳細はそのドキュメントを参照してください。また、なぜこの型が作られたのかについては、この
[GopherCon 2017 のライトニングトーク](https://www.youtube.com/watch?v=C1EtfDnsdDs)
（[スライド](https://github.com/gophercon/2017-talks/blob/master/lightningtalks/BryanCMills-AnOverviewOfSyncMap/An%20Overview%20of%20sync.Map.pdf)）
でさらに知ることができます。これはGoの `map` 型を汎用的に置き換えるものではありません。どのような場面で使うべきかについては、
ドキュメントを確認してください。

`testing` パッケージにも追加があります。新しい `Helper` メソッドが [testing.T](https://pkg.go.dev/testing#T.Helper) と
[testing.B](https://pkg.go.dev/testing#B.Helper) の両方に追加され、呼び出し元の関数をテストヘルパー関数としてマークします。
`testing` パッケージがファイルと行番号の情報を出力する際、ヘルパー関数自身の中の行ではなく、ヘルパー関数を呼び出した箇所の
位置を表示するようになります。

例として、次のテストを考えてみましょう。

```go
package p

import "testing"

func failure(t *testing.T) {
    t.Helper() // この呼び出しによってこの関数はエラーレポートに現れなくなります。
    t.Fatal("failure")
}

func Test(t *testing.T) {
    failure(t)
}
```

`failure` が自身をテストヘルパーだと示しているため、 `Test` の実行中に出力されるエラーメッセージは、 `failure` が
`t.Fatal` を呼び出している7行目ではなく、 `failure` が呼び出されている11行目を示すようになります。

`time` パッケージは、それぞれの `Time` の値の中で単調時刻（monotonic time）を透過的に追跡するようになりました。
これにより、壁時計の調整が発生している状況でも、2つの `Time` 値の間の経過時間を計算する処理が安全になりました。
たとえば、次のコードはうるう秒によるクロックのリセットをまたいでも正しい経過時間を計算できるようになります。

```go
start := time.Now()
f()
elapsed := time.Since(start)
```

詳細については[パッケージのドキュメント](http://beta.golang.org/pkg/time/#hdr-Monotonic_Clocks)と
[設計ドキュメント](https://github.com/golang/proposal/blob/master/design/12914-monotonic.md)を参照してください。

最後に、Goコンパイラを高速化する取り組みの一環として、Go 1.9ではパッケージ内の関数を並行にコンパイルするようになりました。

Go 1.9には、他にも数多くの追加機能や改善、修正が含まれています。変更点の全体と、ここまでに挙げた改善についてのさらに
詳しい情報は、[Go 1.9 のリリースノート](https://go.dev/doc/go1.9)で確認できます。

このリリースを祝して、世界各地のGoユーザーグループが
[リリースパーティー](https://github.com/golang/cowg/blob/master/events/2017-08-go1.9-release-party.md)を開催しています。

By Francesc Campoy

