Go 1.2 リリース

Go 1.2 is released by Andrew Gerrand

Go プログラミング言語の最新の安定版である Go 1.2 のリリースを発表できることを嬉しく思います。

バイナリ配布物はいつもの場所からダウンロードできます。もしソースから コンパイルしたい場合は、release タグか go1.2 タグを使ってください。

今回の新しいリリースは、5月にリリースされた Go 1.1 からおよそ7ヶ月後のものであり、1.1 と 1.0 の間の14ヶ月と比べると かなり短い間隔になっています。今後のメジャーリリースの間隔もこれと同程度になると見込んでいます。

Go 1.2 には、いくつかの小さな言語仕様の変更、言語の実装とツール群への数々の改善、 いくらかのパフォーマンス改善、そして標準ライブラリへの多くの追加や後方互換性を保ったままの変更が含まれています。

詳細はすべてリリースノートを読んでください。中には、バグを含む既存のプログラムの 振る舞いに影響を与える変更もあります。以下ではこのリリースのハイライトを紹介します。

新しい3つのインデックスを持つスライス構文により、長さだけでなく容量も指定できる ようになりました。これにより、プログラマは基底配列のうち限られた部分にしかアクセスできないスライス値を渡せるようになります。 これは以前は unsafe パッケージを使わなければ実現できなかったテクニックです。

ツールチェインにおける大きな新機能は、テストカバレッジ結果を計算して表示する機能です。 詳細は go testcover ツールのドキュメントを参照してください。今週後半には、この新機能を 詳しく解説する記事を公開する予定です。

ゴルーチンはプリエンプティブにスケジューリングされるようになりました。 これは、関数に入るタイミングでときどきスケジューラが呼び出されるようになったということです。これにより、 忙しいゴルーチンが同じスレッド上の他のゴルーチンを飢餓状態にしてしまうことを防げます。

ゴルーチンのデフォルトのスタックサイズが引き上げられたことで、一部のプログラムのパフォーマンスが改善されるはずです。 以前のサイズでは、パフォーマンスが重要な箇所で高コストなスタックセグメントの切り替えが発生しがちでした。 その一方で、スタックサイズオペレーティングシステムのスレッド数への新しい制限により、 不具合のあるプログラムがマシンのリソースをすべて消費してしまうことを防げるはずです。 これらの制限は、runtime/debug パッケージにある新しい関数を使って調整できます。

最後に、標準ライブラリへの数多くの変更の中でも重要なものとして、 新しいencoding パッケージPrintf の書式文字列における インデックス付き引数、そしてテンプレート関連パッケージへの 便利な追加機能が挙げられます。

このリリースの一環として、Go Playground も Go 1.2 に更新されました。これにより、 Go Tour やこのブログなど、Playground を利用しているサービスにも影響があります。 この更新では、サンドボックス内でスレッドや osnetunsafe の各パッケージを使えるようにもなり、 より実際の Go 環境に近い形になりました。

バグ報告を送ってくれた多くのユーザーから、コアに1600以上の変更をコミットしてくれた116人ものコントリビューターまで、 今回のリリースを実現するために力を貸してくれたすべての人へ。皆さんの協力はこのプロジェクトにとってかけがえのないものです。 ありがとうございました!

この記事は、Gopher Academy が贈る、12月1日から25日まで毎日更新される連載記事 Go Advent Calendar の第1回目です。

By Andrew Gerrand