Go 1.6 リリース
Go 1.6 is released by Andrew Gerrand
本日、Goの7番目のメジャーな安定版リリースとなるGo version 1.6をリリースしました。ダウンロードページから今すぐ入手できます。6か月前のGo 1.5のリリースでは劇的な実装の変更がありましたが、今回のリリースはより漸進的なものです。
最も重要な変更は、net/httpパッケージにおけるHTTP/2のサポートです。HTTP/2はHTTPの後継となる新しいプロトコルで、すでにブラウザベンダーや主要なWebサイトで広く採用されています。Go 1.6では、HTTPSを使用する場合にサーバーとクライアントの両方でデフォルトでHTTP/2サポートが有効になり、人気の高いCaddy Webサーバーをはじめとする幅広いGoプロジェクトに、この新しいプロトコルの恩恵がもたらされます。
テンプレートパッケージにはいくつかの新機能が加わりました。よりきれいなテンプレート出力を生成するためのテンプレートアクション周辺の空白のトリミングのサポートと、他のテンプレートを基に構築するテンプレートを作成するのに使える{{block}}アクションの導入です。これらの新機能は新しいテンプレートのサンプルプログラムで実際に確認できます。
Go 1.5では、環境変数によって有効化する「vendor」ディレクトリの実験的なサポートが導入されました。Go 1.6では、この機能は今やデフォルトで有効になっています。この新機能に沿わない形で「vendor」という名前のディレクトリを含んでいるソースツリーは、ビルドが壊れるのを避けるために変更が必要になります(最も簡単な対処法はディレクトリ名を変更することです)。
ランタイムには、マップの並行的な誤用を検出する軽量かつベストエフォートな仕組みが追加されました。これまでと同様、あるゴルーチンがマップに書き込みをしている場合、他のどのゴルーチンもそのマップを並行して読み書きしてはいけません。ランタイムがこの状態を検出すると、診断結果を出力してプログラムをクラッシュさせます。問題についてさらに詳しく知りたい場合は、レースディテクタを使って実行するのが一番です。レースディテクタを使えば、より確実に競合状態を特定でき、より詳細な情報も得られます。
また、ランタイムはプログラムを終了させるパニックの出力方法も変更しました。これまではすべての既存ゴルーチンのスタックを出力していましたが、今ではパニックを起こしたゴルーチンのスタックのみを出力します。この振る舞いは、GOTRACEBACK環境変数を使うか、debug.SetTraceback関数を呼び出すことで設定できます。
cgoを利用しているユーザーは、GoとCのコード間でポインタを共有する際のルールに大きな変更が加えられたことに注意する必要があります。このルールは、そうしたCコードがGoのガベージコレクタと共存できることを保証するために設計されており、プログラムの実行中にチェックされます。そのため、クラッシュを避けるためにコードの変更が必要になる場合があります。詳細はリリースノートとcgoのドキュメントを参照してください。
コンパイラ、リンカ、そしてgoコマンドには、-raceに似た新しい-msanフラグが加わりました。これはlinux/amd64でのみ利用可能で、Clang MemorySanitizerとの相互運用を可能にします。これは、疑わしいCやC++のコードを含むプログラムをテストする際に役立ちます。新しいポインタルールに沿ってcgoのコードをテストする際に、試してみるとよいでしょう。
Go 1.6でビルドされたGoプログラムのパフォーマンスは、Go 1.5でビルドされたものとほぼ同等です。ガベージコレクションの停止時間はGo 1.5よりもさらに短くなっていますが、これは特に大量のメモリを使用するプログラムで顕著です。コンパイラのツールチェインのパフォーマンスに関しては、ビルド時間はGo 1.5とほぼ同じになるはずです。
sort.Sort内部のアルゴリズムは改良され、約10%高速に動作するようになりました。ただしこの変更により、等しいが区別可能な要素について特定の順序を期待しているプログラムが壊れる可能性があります。そのようなプログラムでは、望ましい順序を示すようにLessメソッドを改良するか、等しい値については入力順序を保持するsort.Stableを使用してください。
そしてもちろん、他にも多くの追加機能、改善、修正があります。それらすべては包括的なリリースノートで確認できます。
リリースを記念して、世界中のGoユーザーグループが2月17日にリリースパーティを開催します。オンラインでは、Goのコントリビュータたちが今後24時間、golangサブレディットで質疑応答セッションを開催します。プロジェクトやこのリリース、あるいはGo全般について質問がある方は、ぜひ議論に参加してください。
リリースに貢献してくれたすべての人に感謝します。よいハッキングを。
By Andrew Gerrand