Goの最新リリース、バージョン1.12では、言語に対する構文上の変更はなく、ランタイム性能、ツールチェーン、モジュールシステムの改善に焦点が当てられている。加えて、TLS 1.3のオプトインサポートと、macOSおよびiOSのサポート改善を提供する。
Go 1.12の最も重要な変更は、メモリ割り当て/解放の処理方法に関するものだ。特に、ガベージコレクションのスイープステージにおける性能改善をもたらし、ヒープの大部分が生存のままである場合、最初から最後まで全メモリをスキャンして解放できるブロックを特定する。これにより、ガベージコレクション直後に新しいメモリを割り当てるのに要する時間を削減する。加えて、ガベージコレクタはメモリをより積極的にOSに解放するようになり、プログラムの全体的なメモリフットプリントが改善されている。この挙動は特に、既存のヒープ領域を再利用できない大きな割り当ての後に強制される。
この他、Goランタイムにはタイマーとデッドラインコードの改善によるネットワーク接続デッドラインの素早い処理、cpu.extension=off
環境変数によるオプショナルCPU命令セット拡張の使用無効化のサポート、大きなヒープ割り当てを使用するプログラムのメモリプロファイル精度向上が含まれている。
Go 1.12では、モジュールサポートもいくつかの点で改善されている。Go 1.11で導入された新しいモジュールシステムは、従来のGOPATH
によるアプローチと共存している。移行を容易にするため、Go 1.11は、モジュールのオン・オフを切り替えるGO111MODULE
環境変数と、GOPATH/src
の外側のディレクトリツリーでgo
コマンドが実行され、そのルートがgo.mod
ファイルを含んでいる場合は常にモジュールシステムを使おうとするデフォルトのauto
モードを導入した。Go 1.12はさらに一歩進めて、たとえgo.mod
ファイルが存在しなくても、いくつかのgo
コマンドをモジュールモードで実行できる。加えて、Go 1.12では、モジュールシステムの実装にいくつか修正が入っている。
先に述べたように、コンパイラツールチェーンも改善されており、より積極的な関数のインライン化、使用する言語バージョンを指定する新しい-lang
フラグ、デバッグ情報の改善、Goとアセンブリ関数で使われている異なる呼び出し規約によるABIレベルでの潜在的な破壊的変更が含まれている。
Go 1.12では、TLS 1.3のサポートも導入された。これはGODEBUG
環境変数でtls13=1
を使用することで有効化できる。TLS 1.3は、ConnectionStateのTLSUniqueと再ネゴシエーションを除く全てのTLS 1.2機能をサポートし、より優れたまたは改善されたセキュリティとパフォーマンスを提供する。ただし、暗号スイートの設定など、まだ入っていないTLS 1.3機能もある。TLS 1.3はGo 1.13でデフォルトになる予定だ。
最後に、最新のGoリリースでは、macOS、iOS、AIX、ARM上のWindowsの互換性も向上している。
Go 1.12には、ここで紹介したもの以外にもたくさん含まれているため、公式のリリースノートを見逃さないようにしよう。