最近リリースされた Go 1.9の最大の変更は、型エイリアス宣言を使った段階的なコード改修のサポート改善だ。Go 1.9では、ガベージコレクタとコンパイラも改善されている。
GoogleエンジニアのRuss Cox氏の説明によると、段階的なコード改修は、コードのリファクタリングに有用なアプローチで、大きなコードベースでは非常に有益だ。簡単に言うと、段階的なコード改修は、全ての変更をアトミックに(1つのコミットで)行うのではなく、一連のステップ(コミット)によって大きなリファクタリングを実行することを目指している。通常、アトミックなリファクタリングの方が、概念レベルではシンプルだが、大きなコードベースでは本当に巨大なコミットになる恐れがある。これはレビューやマージを困難にする。段階的なコード改修では、コードを3ステップでリファクタリングする。まず、古いAPIと共存できる新しいAPIを導入する。そのため、古いAPIを使っているところを一度に全部変更する必要はない。次に、古いAPIを使っているところを新しいAPIにコンバートする。最後に、古いAPIを削除する。
段階的なコード改修を可能にするには、定数、関数、変数、型に別名を付けられる必要がある。Goは次のような宣言で型エイリアスを定義できるようになる。
type OldAPI = NewPackage.API
これを使うと、OldAPI
への全ての参照を、リファクタリングした型を使うように変えることができる。段階的なコード改修に関する様々な議論について、Russ Cox氏の解説は必見だ。
GoogleエンジニアのFrancesc Campoy氏の説明によると、Go 1.9におけるエンジニアリング取り組みのほとんどは、ランタイム、コードライブラリ、ツールの改善に関連しているという。最も重要な変更は以下の通り。
-
多数のライブラリ関数がコンカレントGCをトリガーするおかげで、Goガベージコレクタのパフォーマンスが改善された。これはプログラム全体ではなく呼び出し元のgoroutineだけをブロックする。加えて、大きなオブジェクトのヒープ割り当てが大幅に改善された。
-
Go 1.9コンパイラでは、同一パッケージに属する関数を並列にコンパイルできるようになった。別のパッケージの並列コンパイルはこれまでのコンパイラですでに可能だった。
-
コアライブラリフロントでは、モノトニック時刻(monotonic time)のトラッキングにより、
time
パッケージを安全に利用できるようになる。これにより、ウォールクロック(wall clock)が調整された場合でも、Time
値との比較が容易になる。加えて、sync
パッケージに属する新しいMap
型は、一定時間で読み出し、格納、削除できるスレッドセーフで並行アクセス可能なマップを提供する。
Go 1.9に導入された全ての変更について学ぶためには、公式のリリースノートを読むようにしよう。
Rate this Article
- Editor Review
- Chief Editor Action