本日、2016年8月16日、Goプログラミング言語の第8の安定版リリースであるGo 1.7がリリースされました 。 いつものように、リリースは前のリリースから半年後の計画に従ってリリースされ、後方互換性のない変更はありません。 同時に、Go 1.7には多くの新しい重要な変更があり、コンパイル時間とバイナリのサイズが削減され、作業速度が向上し、コンテキストパッケージが最終的に標準ライブラリに追加されます。 katomの下で、イノベーションとイノベーションのより詳細なレビュー。
新しいSSAバックエンド
おそらく、このリリースで最も重要な変更の1つは、 SSAフォーム(静的単一割り当て)をサポートする新しいコンパイラバックエンドの使用です。 SSAバックエンドへの移行は、より効率的なコードを最適化および生成するための新しい機会を提供します。これは、このリリースですでに見られます。
古いバックエンドと新しいバックエンドをコンパイルした結果を比較するには、go buildコマンドにパラメーターを渡すだけです。
go build -gcflags="-ssa=0"
新しいもの(Go 1.7ではデフォルトでSSAが有効になっています)。
go build
新しいバックエンドに切り替えると、プログラム速度が5から35%に向上します。
GOSSAFUNC変数を使用して、バックエンドによって生成されたコードを掘り下げることもできます。
GOSSAFUNC=main go build && open ssa.html
新しいメタデータ形式
この変更は一般ユーザーには完全に見えませんが、言及する価値はあります。 Go 1.7は、バイナリファイルのメタデータをエクスポートするために以前の形式よりもコンパクトで効率的な新しい形式を使用します。 いくつかの古いバグを修正し、小さなバイナリを生成します。 オプション-newexport = 0で無効にできます。
go build -newexport=0
MacOS X 10.12「Sierra」のサポート
Goの今後のバージョンでビルドされたバイナリは、さまざまなOSの将来のすべてのバージョンで動作することを習慣的に期待していますが、まだリリースされていないMacOS X 10.12の場合、これはそうではありません。 MacOSのこのリリースでは、gettimeofday()システムコールの実装が変更され、Goは実際にその実装のコピーを使用するため、カーネルで変更する場合は、Goでもコードを変更する必要がありました。 これを実際にどのように反映できるか-Go <1.6.3でビルドされたMacOS Xバイナリは、MacOS X 10.12 'Sierra'では正しく動作しません。 バイナリで配布する場合は、Go 1.6.3または1.7でビルドして、MacOS X 10.12で正しく動作するようにしてください。
コンパイラーとリンカーの最適化と高速化
上記の点に加えて、標準ライブラリ、コンパイラ、およびリンカーの多くのコンポーネントが最適化されました。その結果、バイナリは20〜30%小さくなり、コードはGo 1.6よりもはるかに高速に動作するはずです(特にx86-64プラットフォーム)。 同時に、新しいバックエンドのおかげで、次のリリースのために計画された最適化のためのスペースがまだたくさんあります。
また、標準最適化ライブラリの一部のパッケージでは、10%を超えるアクセラレーションが追加されました-crypto / sha1、crypto / sha256、encoding / binary、fmt、hash / adler32、hash / crc32、hash / crc64、image / color、math / big、strconv、文字列、unicodeおよびunicode / utf16。
また、多数のゴルーチンが実行されているプログラムでは、ガベージコレクターの一時停止ははるかに短くなります。
コンテキスト
標準ライブラリへの最も予想される追加の1つは、golang.org/x/net/contextパッケージのcontextへの転送です。 ネットワークからの要求を処理するコードではコンテキストが最もよく使用されますが、その機能はネットワークでの処理のみに限定されないため、「net」という言葉は名前から削除されました。 たとえば、os / execなどに使用できます。
なぜこれが重要なのですか? 多くのhttp-frameworksとパッケージがGoに登場しました。そのタスクは、着信要求のハンドラー内でコンテキストを確実に転送することでした。 ネット/コンテキストは徐々にこのニッチを占めるようになりましたが、現在、標準ライブラリのコンテキストと、ネット、ネット/ http、os / execパッケージのネイティブサポートにより、リクエストコンテキストで機能するコードの記述がはるかに単純で統一されています。
タイプDialerの新しいメソッドがnetパッケージに登場しました:
func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error)
接続が確立される前にコンテキストタイムアウトが期限切れになると、DialContextはエラーを返します。
net / httpのRequestタイプでは、 Context()およびWithContext()メソッドが登場しました:
func (r *Request) Context() context.Context
func (r *Request) WithContext(ctx context.Context) *Request
Context()メソッドはリクエストのコンテキストを取得するために使用されます;変更するには、WithContext()を使用します。 送信リクエストでは、コンテキストがリクエストのキャンセルを制御するようになりました。
仕入先
このリリースでは、GO15VENDOREXPERIMENT変数はサポートされなくなりました。現在、自動販売は標準のGoチューニング機能です。
テスト中
テストの作成に使用されるテストパッケージには、ネストされた階層テストとベンチマークのサポートが含まれています。 これは、BDDテスト、テーブルテスト、および一般的なテストのよりコンパクトな組織にとって非常に便利です。 コード例:
func TestTeardownParallel(t *testing.T) {
詳細はパッケージのドキュメントで入手できます: https : //golang.org/pkg/testing/#hdr-Subtests_and_Sub_benchmarks
雑多
- goツールトレースは、トレースを分析するためにバイナリを必要としなくなり、トレースのオーバーヘッドは400%から20%に減少しました。
- シンプルなzipkin-analogツールhttptraceが標準ライブラリに含まれています-net / http / httptrace /
- os / user.Currentはcgoを必要としなくなりました(したがって、標準ライブラリでcgoがまだ使用されている場所が3つ残っています)
変更の完全なリストは、 https : //golang.org/doc/go1.7から入手できます。
更新する必要がありますか?
通常、新しいリリースに更新してもリスクはありません。Goコミュニティでは、大多数が最新バージョンを使用しています。 しかし、テストモードで1.7のビルドをテストするのを待つ最初の数週間は理にかなっています。 最後の2つのリリースにはマイナーリリース(1.5.1および1.6.1)があり、メインリリース後の最初の数週間に見つかった非常に特定のバグに対する修正が含まれています。
参照資料
https://golang.org/doc/go1.7
https://golang.org/dl/
PS。 このリリースには170人が参加し、そのうち140人はGoogleからではなく、Goコミュニティからでした。