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


# Go 1.6 リリース

[Go 1.6 is released](https://go.dev/blog/go1.6) by Andrew Gerrand

本日、Goの7番目のメジャーな安定版リリースとなる[Go version 1.6](https://go.dev/doc/go1.6)をリリースしました。[ダウンロードページ](https://go.dev/dl/)から今すぐ入手できます。6か月前の[Go 1.5のリリース](https://go.dev/blog/go1.5)では劇的な実装の変更がありましたが、今回のリリースはより漸進的なものです。

最も重要な変更は、[net/httpパッケージ](https://go.dev/pkg/net/http/)における[HTTP/2](https://http2.github.io/)のサポートです。HTTP/2はHTTPの後継となる新しいプロトコルで、すでにブラウザベンダーや主要なWebサイトで広く採用されています。Go 1.6では、HTTPSを使用する場合にサーバーとクライアントの両方で[デフォルトでHTTP/2サポートが有効](https://go.dev/doc/go1.6#http2)になり、人気の高い[Caddy Webサーバー](https://caddyserver.com/download)をはじめとする幅広いGoプロジェクトに、この新しいプロトコルの[恩恵](https://http2.github.io/faq/)がもたらされます。

テンプレートパッケージにはいくつかの新機能が加わりました。よりきれいなテンプレート出力を生成するための[テンプレートアクション周辺の空白のトリミング](https://go.dev/pkg/text/template/#hdr-Text_and_spaces)のサポートと、他のテンプレートを基に構築するテンプレートを作成するのに使える[`{{block}}`アクション](https://go.dev/pkg/text/template/#hdr-Actions)の導入です。これらの新機能は[新しいテンプレートのサンプルプログラム](https://cs.opensource.google/go/x/example/+/master:template)で実際に確認できます。

Go 1.5では、環境変数によって有効化する「vendor」ディレクトリの[実験的なサポート](https://go.dev/s/go15vendor)が導入されました。Go 1.6では、この機能は今やデフォルトで有効になっています。この新機能に沿わない形で「vendor」という名前のディレクトリを含んでいるソースツリーは、ビルドが壊れるのを避けるために変更が必要になります(最も簡単な対処法はディレクトリ名を変更することです)。

ランタイムには、マップの並行的な誤用を検出する軽量かつベストエフォートな仕組みが追加されました。これまでと同様、あるゴルーチンがマップに書き込みをしている場合、他のどのゴルーチンもそのマップを並行して読み書きしてはいけません。ランタイムがこの状態を検出すると、診断結果を出力してプログラムをクラッシュさせます。問題についてさらに詳しく知りたい場合は、[レースディテクタ](https://go.dev/blog/race-detector)を使って実行するのが一番です。レースディテクタを使えば、より確実に競合状態を特定でき、より詳細な情報も得られます。

また、ランタイムはプログラムを終了させるパニックの出力方法も変更しました。これまではすべての既存ゴルーチンのスタックを出力していましたが、今ではパニックを起こしたゴルーチンのスタックのみを出力します。この振る舞いは、[GOTRACEBACK](https://go.dev/pkg/runtime/#hdr-Environment_Variables)環境変数を使うか、[debug.SetTraceback](https://go.dev/pkg/runtime/debug/#SetTraceback)関数を呼び出すことで設定できます。

cgoを利用しているユーザーは、GoとCのコード間でポインタを共有する際のルールに大きな変更が加えられたことに注意する必要があります。このルールは、そうしたCコードがGoのガベージコレクタと共存できることを保証するために設計されており、プログラムの実行中にチェックされます。そのため、クラッシュを避けるためにコードの変更が必要になる場合があります。詳細は[リリースノート](https://go.dev/doc/go1.6#cgo)と[cgoのドキュメント](https://go.dev/cmd/cgo/#hdr-Passing_pointers)を参照してください。

コンパイラ、リンカ、そしてgoコマンドには、`-race`に似た新しい`-msan`フラグが加わりました。これはlinux/amd64でのみ利用可能で、[Clang MemorySanitizer](http://clang.llvm.org/docs/MemorySanitizer.html)との相互運用を可能にします。これは、疑わしいCやC++のコードを含むプログラムをテストする際に役立ちます。新しいポインタルールに沿ってcgoのコードをテストする際に、試してみるとよいでしょう。

Go 1.6でビルドされたGoプログラムのパフォーマンスは、Go 1.5でビルドされたものとほぼ同等です。ガベージコレクションの停止時間はGo 1.5よりもさらに短くなっていますが、これは特に大量のメモリを使用するプログラムで顕著です。コンパイラのツールチェインのパフォーマンスに関しては、ビルド時間はGo 1.5とほぼ同じになるはずです。

[sort.Sort](https://go.dev/pkg/sort/#Sort)内部のアルゴリズムは改良され、約10%高速に動作するようになりました。ただしこの変更により、等しいが区別可能な要素について特定の順序を期待しているプログラムが壊れる可能性があります。そのようなプログラムでは、望ましい順序を示すように`Less`メソッドを改良するか、等しい値については入力順序を保持する[sort.Stable](https://go.dev/pkg/sort/#Stable)を使用してください。

そしてもちろん、他にも多くの追加機能、改善、修正があります。それらすべては包括的な[リリースノート](https://go.dev/doc/go1.6)で確認できます。

リリースを記念して、世界中の[Goユーザーグループ](https://go.dev/wiki/Go-1.6-release-party)が2月17日にリリースパーティを開催します。オンラインでは、Goのコントリビュータたちが今後24時間、[golangサブレディット](https://reddit.com/r/golang)で質疑応答セッションを開催します。プロジェクトやこのリリース、あるいはGo全般について質問がある方は、ぜひ[議論に参加してください](https://www.reddit.com/r/golang/comments/46bd5h/ama_we_are_the_go_contributors_ask_us_anything/)。

リリースに貢献してくれたすべての人に感謝します。よいハッキングを。

By Andrew Gerrand

