Go 1.9 のリリース

Go 1.9 is released by Francesc Campoy

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

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

type T1 = T2

この宣言は、 byte がこれまでずっと uint8 のエイリアスであったのと同じように、型 T2 に対してエイリアス名 T1 を 導入します。この追加機能の詳細については、型エイリアスの設計ドキュメントリファクタリングに関する記事で解説しています。

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

sync パッケージには、並行アクセスに対して安全な新しい Map 型が追加されました。 詳細はそのドキュメントを参照してください。また、なぜこの型が作られたのかについては、この GopherCon 2017 のライトニングトークスライド) でさらに知ることができます。これはGoの map 型を汎用的に置き換えるものではありません。どのような場面で使うべきかについては、 ドキュメントを確認してください。

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

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

package p

import "testing"

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

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

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

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

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

詳細についてはパッケージのドキュメント設計ドキュメントを参照してください。

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

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

このリリースを祝して、世界各地のGoユーザーグループが リリースパーティーを開催しています。

By Francesc Campoy