Goブログ

Go 1.9リリース

Francesc Campoy
2017年8月24日

本日、GoチームはGo 1.9のリリースを発表できることを嬉しく思います。ダウンロードページから入手できます。言語、標準ライブラリ、ランタイム、ツールに多くの変更が加えられています。この投稿では、最も重要な目に見える変更について説明します。このリリースに投入されたエンジニアリング作業の大部分は、ランタイムとツールの改善に向けられており、それほどエキサイティングな発表ではありませんが、それでも素晴らしいリリースです。

言語への最も重要な変更点は、型エイリアスの導入です。これは、段階的なコード修復をサポートするために作成された機能です。型エイリアスの宣言は次の形式になります。

type T1 = T2

この宣言は、byteが常にuint8のエイリアスであるのと同じように、型T2のエイリアス名T1を導入します。型エイリアスの設計ドキュメントリファクタリングに関する記事では、この追加について詳しく説明しています。

新しいmath/bitsパッケージは、符号なし整数のビットカウントと操作関数を提供し、可能な場合は特別なCPU命令によって実装されます。たとえば、x86-64システムでは、bits.TrailingZeros(x)BSF命令を使用します。

syncパッケージには、新しいMap型が追加され、同時アクセスに対して安全になりました。ドキュメントから詳細を読むことができ、それが作成された理由については、このGopherCon 2017ライトニングトーク(スライド)で詳細を学ぶことができます。これはGoのmap型の一般的な代替ではありません。いつ使用するべきかについては、ドキュメントを参照してください。

testingパッケージにも追加があります。testing.Ttesting.Bの両方に追加された新しいHelperメソッドは、呼び出し側の関数をテストヘルパー関数としてマークします。testingパッケージがファイルと行の情報を印刷するときは、ヘルパー関数自体の行ではなく、ヘルパー関数の呼び出しの場所が表示されます。

たとえば、次のテストを考えてみてください。

package p

import "testing"

func failure(t *testing.T) {
    t.Helper() // This call silences this function in error reports.
    t.Fatal("failure")
}

func Test(t *testing.T) {
    failure(t)
}

failureは自身をテストヘルパーとして識別するため、Test中に印刷されるエラーメッセージは、failureが呼び出された11行目ではなく、failuret.Fatalを呼び出した7行目を示します。

timeパッケージは現在、各Time値で単調時間を透過的に追跡しているため、ウォールクロックの調整がある場合でも、2つのTime値間の期間を計算する操作が安全になります。たとえば、このコードは、うるう秒クロックのリセット後でも正しい経過時間を計算します。

start := time.Now()
f()
elapsed := time.Since(start)

詳細については、パッケージドキュメント設計ドキュメントを参照してください。

最後に、Goコンパイラの速度を向上させるための取り組みの一環として、Go 1.9はパッケージ内の関数を同時にコンパイルします。

Go 1.9には、さらに多くの追加、改善、修正が含まれています。上記の改善に関する詳細情報と、変更の完全なセットについては、Go 1.9リリースノートを参照してください。

リリースを祝って、世界中のGoユーザーグループがリリースパーティーを開催しています。

次の記事: コミュニティアウトリーチワーキンググループ
前の記事: コントリビューションワークショップ
ブログインデックス