Go 1.7 リリースノート

Go 1.7の紹介

最新のGoリリースであるバージョン1.7は、1.6の6ヶ月後にリリースされました。変更の大部分は、ツールチェーン、ランタイム、ライブラリのインプリメンテーションにあります。言語仕様には1つのマイナーな変更があります。従来どおり、このリリースはGo 1の互換性の約束を維持しています。ほとんどすべてのGoプログラムは、以前と同様にコンパイルおよび実行されると予想されます。

このリリースでは、IBM LinuxONEへのポートを追加し、x86-64コンパイラのバックエンドを更新してより効率的なコードを生成し、x/netサブリポジトリから昇格され、現在は標準ライブラリで使用されているcontextパッケージを含み、テストとベンチマークの階層を作成するためのサポートをtestingパッケージに追加しました。また、Go 1.5で開始されたベンダーサポートを最終化し、標準機能にしました。

言語への変更

このリリースには、非常に小さな言語の変更が1つあります。ステートメントの終了に関するセクションでは、ステートメントリストが終了ステートメントで終わるかどうかを判断するために、「最後の空でないステートメント」が終わりとして考慮されることが明確にされています。これは、gcおよびgccgoコンパイラツールチェーンの既存の動作と一致します。以前のリリースでは、定義は「最後のステートメント」のみを参照しており、少なくとも末尾の空のステートメントの影響は不明確でした。go/typesパッケージは、この点でgcおよびgccgoコンパイラツールチェーンと一致するように更新されました。この変更は、既存のプログラムの正確性には影響しません。

ポート

Go 1.7は、macOS 10.12 Sierraのサポートを追加しました。1.7より前のバージョンのGoでビルドされたバイナリは、Sierraでは正しく動作しません。

Go 1.7は、Linux on z Systemslinux/s390x)への実験的なポートと、ARM上のPlan 9(plan9/arm)へのポートの開始を追加しました。

Go 1.6で追加された64ビットMIPS上のLinuxへの実験的なポート(linux/mips64およびlinux/mips64le)は、cgoと外部リンキングの完全なサポートを持つようになりました。

リトルエンディアン64ビットPowerPC(linux/ppc64le)への実験的なポートは、POWER8アーキテクチャ以降が必要になりました。ビッグエンディアン64ビットPowerPC(linux/ppc64)はPOWER5アーキテクチャのみが必要です。

OpenBSDポートは、getentropy(2)システムコールへのアクセスのため、OpenBSD 5.6以降が必要です。

既知の問題

FreeBSDには、知られているが理解されていない不安定性がいくつかあります。これにより、まれにプログラムがクラッシュすることがあります。issue 16136issue 15658、およびissue 16396を参照してください。これらのFreeBSD固有の問題の解決に協力していただければ幸いです。

ツール

アセンブラ

64ビットARMシステムの場合、ベクトルレジスタ名はV0からV31に修正されました。以前のリリースでは、誤ってV32からV63と呼ばれていました。

64ビットx86システムの場合、次の命令が追加されました:PCMPESTRIRORXLRORXQVINSERTI128VPADDDVPADDQVPALIGNRVPBLENDDVPERM2F128VPERM2I128VPORVPSHUFBVPSHUFDVPSLLDVPSLLDQVPSLLQVPSRLDVPSRLDQ、およびVPSRLQ

コンパイラツールチェーン

このリリースには、64ビットx86システム用の新しいコード生成バックエンドが含まれています。これは、2015年から開発が進められてきた2015年の提案に基づいています。SSAに基づく新しいバックエンドは、よりコンパクトで効率的なコードを生成し、境界チェックの削除などの最適化のためのより良いプラットフォームを提供します。新しいバックエンドにより、ベンチマークプログラムに必要なCPU時間が5〜35%削減されます。

このリリースでは、コンパイラに-ssa=0を渡すことで、新しいバックエンドを無効にできます。新しいバックエンドを無効にしないとプログラムがコンパイルまたは実行できない場合は、バグレポートを提出してください。

コンパイラがパッケージアーカイブに書き込むエクスポートされたメタデータの形式が変更されました。古いテキスト形式は、よりコンパクトなバイナリ形式に置き換えられました。これにより、パッケージアーカイブが多少小さくなり、いくつかの長年のコーナーケースのバグが修正されました。

このリリースでは、コンパイラに-newexport=0を渡すことで、新しいエクスポート形式を無効にできます。新しいエクスポート形式を無効にしないとプログラムがコンパイルまたは実行できない場合は、バグレポートを提出してください。

リンカーの-Xオプションは、Go 1.6リリースで発表され、リンカーによって印刷された警告にもあるように、珍しい2つの引数の形式-X name valueをサポートしなくなりました。代わりに-X name=valueを使用してください。

コンパイラとリンカーは最適化されており、このリリースではGo 1.6よりも大幅に高速に実行されますが、それでも望ましい速度よりも遅いため、今後のリリースでも最適化が続けられます。

コンパイラツールチェーンと標準ライブラリ全体での変更により、このリリースでビルドされたバイナリは、通常、Go 1.6でビルドされたバイナリよりも小さくなります。場合によっては、最大20〜30%小さくなることもあります。

x86-64システムでは、Goプログラムは、LinuxのperfやIntelのVTuneなどのプロファイリングツールで期待されるようにスタックフレームポインタを維持するようになりました。これにより、これらのツールを使用してGoプログラムを分析および最適化しやすくなります。フレームポインタの維持には、わずかな実行時オーバーヘッドがあります。これは変動しますが、平均して約2%です。今後のリリースでは、このコストを削減することを期待しています。フレームポインタを使用しないツールチェーンをビルドするには、make.bashmake.bat、またはmake.rcを実行するときにGOEXPERIMENT=noframepointerを設定します。

Cgo

cgoを使用するパッケージには、Fortranソースファイル(C、C++、Objective C、SWIGに加えて)を含めることができるようになりましたが、Goバインディングは引き続きC言語APIを使用する必要があります。

Goバインディングは、新しいヘルパー関数C.CBytesを使用できるようになりました。Goのstringを受け取り*C.byte(Cのchar*)を返すC.CStringとは異なり、C.CBytesはGoの[]byteを受け取りunsafe.Pointer(Cのvoid*)を返します。

cgoを使用してビルドされたパッケージとバイナリは、以前のリリースでは、一時ディレクトリ名の埋め込みにより、ビルドごとに異なる出力が生成されていました。このリリースを新しいバージョンのGCCまたはClang(-fdebug-prefix-mapオプションをサポートするもの)と一緒に使用すると、これらのビルドは最終的に決定論的になります。

Gccgo

Goの半期リリーススケジュールとGCCの年次リリーススケジュールの調整により、GCCリリース6にはgccgoのGo 1.6.1バージョンが含まれています。次のリリースであるGCC 7には、Go 1.8バージョンのgccgoが含まれる可能性があります。

Goコマンド

goコマンドの基本操作は変更されていませんが、注目すべき変更がいくつかあります。

このリリースでは、Go 1.6リリースで発表されたように、GO15VENDOREXPERIMENT環境変数のサポートが削除されました。ベンダーサポートは、goコマンドとツールチェーンの標準機能になりました。

go list」で使用できるPackageデータ構造には、特定のパッケージが古いかどうか(再構築が必要かどうか)を説明するStaleReasonフィールドが含まれるようになりました。このフィールドは-fまたは-jsonオプションで使用でき、ターゲットが再構築される理由を理解するのに役立ちます。

go get」コマンドは、git.openstack.orgを参照するインポートパスをサポートするようになりました。

このリリースでは、バイナリのみのパッケージ(対応するソースコードなしでバイナリ形式で配布されるパッケージ)を使用してプログラムをビルドするための実験的な最小限のサポートを追加しました。この機能は、一部の商業環境では必要ですが、ツールチェーンの残りの部分に完全に統合されることを意図したものではありません。たとえば、完全なソースコードへのアクセスを前提とするツールは、そのようなパッケージでは機能しません。「go get」コマンドでそのようなパッケージをサポートする予定はありません。

Go doc

go doc」コマンドは、godocに従って、コンストラクタを構築する型とグループ化するようになりました。

Go vet

“`go vet`”コマンドは、`-copylock`および`-printf`チェックにおいてより正確な解析を行い、可能性のあるテスト関数の名前とシグネチャをチェックする新しい`-tests`チェックが追加されました。新しい`-tests`チェックとの混乱を避けるため、以前から存在していた非公開オプション`-test`は削除されました。これは`-all -shadow`と同等でした。

`vet`コマンドには、新しいチェック`-lostcancel`も追加されました。これは、Go 1.7の新しい`context`パッケージ(下記参照)の`WithCancel`、`WithTimeout`、`WithDeadline`関数によって返されるキャンセル関数の呼び出しに失敗した場合を検出します。関数の呼び出しに失敗すると、親コンテキストがキャンセルされるまで、新しい`Context`が解放されません。(バックグラウンドコンテキストは決してキャンセルされません。)

Go ツール dist

新しいサブコマンド“`go tool dist list`”は、サポートされているすべてのオペレーティングシステム/アーキテクチャの組み合わせを出力します。

Go ツール trace

Go 1.5で導入された“`go tool trace`”コマンドは、様々な点で改良されました。

まず、トレースの収集が以前のリリースよりも大幅に効率化されました。このリリースでは、トレース収集による典型的な実行時間オーバーヘッドは約25%です。以前のリリースでは少なくとも400%でした。第二に、トレースファイルにはファイル名と行番号の情報が含まれるようになり、より自己完結型となり、トレースツールを実行する際に元の実行ファイルが不要になりました。第三に、トレースツールは、ブラウザベースのビューアにおける制限を回避するために、大きなトレースを分割するようになりました。

このリリースでトレースファイルの形式は変更されましたが、Go 1.7のツールは以前のリリースからのトレースを読み取ることができます。

パフォーマンス

常にそうであるように、変更は非常に一般的で多岐にわたるため、パフォーマンスに関する正確な記述は困難です。ガベージコレクタの高速化とコアライブラリの最適化により、ほとんどのプログラムは少し高速に実行されるはずです。x86-64システムでは、新しいコンパイラバックエンドによる生成コードの改善により、多くのプログラムが大幅に高速に実行されます。上記のように、私たちのベンチマークでは、コード生成の変更だけでも、プログラムのCPU時間を通常5〜35%削減します。

`crypto/sha1``crypto/sha256``encoding/binary``fmt``hash/adler32``hash/crc32``hash/crc64``image/color``math/big``strconv``strings``unicode`、および`unicode/utf16`パッケージの実装に10%以上の改善をもたらす大幅な最適化が行われました。

アイドル状態のゴルーチンが多いプログラム、スタックサイズ変動が大きいプログラム、またはパッケージレベルの変数が大きいプログラムでは、ガベージコレクションの一時停止時間がGo 1.6よりも大幅に短縮されるはずです。

標準ライブラリ

コンテキスト

Go 1.7では、`golang.org/x/net/context`パッケージが標準ライブラリに`context`として移動されました。これにより、キャンセル、タイムアウト、およびリクエストスコープデータの受け渡しを、netnet/httpos/execなど、他の標準ライブラリパッケージで使用できるようになります(下記参照)。

コンテキストの詳細については、パッケージドキュメントとGoブログ記事の「Go Concurrent Patterns: Context」を参照してください。

HTTP トレース

Go 1.7では、HTTPリクエスト内のイベントをトレースするためのメカニズムを提供する`net/http/httptrace`パッケージが導入されました。

テスト

`testing`パッケージは、サブテストを含むテストと、サブベンチマークを含むベンチマークの定義をサポートするようになりました。このサポートにより、テーブル駆動型ベンチマークを記述し、階層型テストを作成することが容易になります。また、共通のセットアップコードとティアダウンコードを共有する方法も提供します。詳細はパッケージドキュメントを参照してください。

ランタイム

ランタイムによって開始されたすべてのpanicは、組み込みの`error``runtime.Error`の両方を実装するpanic値を使用するようになりました。言語仕様で要求されているとおりです

panicが発生した場合、シグナルの名前がわかっている場合は、スタックトレースに表示されます。そうでない場合は、Go 1.7以前と同様に、シグナルの番号が使用されます。

新しい関数`KeepAlive`は、割り当てられたオブジェクトがプログラムの特定の時点で到達可能であると宣言するための明示的なメカニズムを提供します。これは通常、関連付けられたファイナライザの実行を遅らせるために使用されます。

新しい関数`CallersFrames`は、`Callers`から取得されたPCスライスを、呼び出しスタックに対応するフレームのシーケンスに変換します。この新しいAPIは、`FuncForPC`を直接使用する場合よりも優先する必要があります。なぜなら、フレームシーケンスは、インライン関数呼び出しを含む呼び出しスタックをより正確に記述できるからです。

新しい関数`SetCgoTraceback`は、cgoを使用して呼び出された同じプロセスで実行されるGoコードとCコード間のより緊密な統合を容易にします。

32ビットシステムでは、ランタイムはオペレーティングシステムによって割り当てられたメモリをアドレス空間内のどこにでも使用できるようになりました。これにより、一部の環境でよく発生する「OSによって割り当てられたメモリが使用可能な範囲にない」というエラーが解消されました。

ランタイムは、すべてのアーキテクチャで未使用のメモリをオペレーティングシステムに返すことができるようになりました。Go 1.6以前では、ランタイムはARM64、64ビットPowerPC、またはMIPSでメモリを解放できませんでした。

Windowsでは、Go 1.5以前のGoプログラムは、`timeBeginPeriod(1)`を呼び出すことで、起動時にグローバルなWindowsタイマー解像度を1msに強制していました。グローバルなタイマー解像度を変更すると、一部のシステムで問題が発生し、テストではスケジューラの性能向上にその呼び出しは不要であることが示唆されたため、Go 1.6ではその呼び出しが削除されました。Go 1.7では、その呼び出しが復活しました。一部のワークロードでは、スケジューラの性能向上にその呼び出しはまだ必要です。

ライブラリのマイナーな変更

常にそうであるように、Go 1の互換性の約束を念頭に置いて、ライブラリに様々なマイナーな変更と更新が行われました。

bufio

以前のGoリリースでは、`Reader``Peek`メソッドが基になるバッファに収まるよりも多くのバイトを要求した場合、空のスライスとエラー`ErrBufferFull`を返していました。現在は、エラー`ErrBufferFull`と共に、基になるバッファ全体を返します。

bytes

`strings`パッケージとの対称性を保つために、新しい関数`ContainsAny``ContainsRune`が追加されました。

以前のGoリリースでは、`Reader``Read`メソッドがデータが残っていない状態で0バイトを要求した場合、カウント0とエラーなしを返していました。現在は、カウント0とエラー`io.EOF`を返します。

`Reader`タイプの再利用を可能にする新しいメソッド`Reset`が追加されました。

compress/flate

パッケージ全体で多くのパフォーマンス最適化が行われました。解凍速度は約10%向上し、`DefaultCompression`の圧縮速度は2倍になりました。

`BestSpeed`コンプレッサは完全に置き換えられ、Snappyに似たアルゴリズムを使用するようになりました。これにより速度は約2.5倍向上しますが、出力は以前のアルゴリズムよりも5〜10%大きくなる可能性があります。

Lempel-Zivエンコーディングではなくハフマンエンコーディングのみを行う新しい圧縮レベル`HuffmanOnly`も追加されました。Lempel-Zivエンコーディングを行わないため、`HuffmanOnly`は新しい`BestSpeed`よりも約3倍高速ですが、生成される圧縮出力は新しい`BestSpeed`によって生成される出力よりも20〜40%大きくなります。

`BestSpeed`と`HuffmanOnly`の両方がRFC 1951に準拠した圧縮出力を生成することに注意することが重要です。つまり、有効なDEFLATE解凍ツールは、これらの出力を引き続き解凍できます。

最後に、解凍ツールの`io.Reader`の実装にマイナーな変更があります。以前のバージョンでは、解凍ツールは、正確にもうバイトを読み取ることができないまで`io.EOF`の報告を遅らせていました。現在は、最後のバイトセットを読み取るときに、より積極的に`io.EOF`を報告します。

crypto/tls

TLS実装は、各接続の最初のいくつかのデータパケットを小さなレコードサイズで送信し、徐々にTLSの最大レコードサイズまで増加します。このヒューリスティックにより、最初のパケットを解読する前に受信する必要があるデータ量が減り、低帯域幅ネットワークでの通信レイテンシが向上します。`Config`の`DynamicRecordSizingDisabled`フィールドをtrueに設定すると、Go 1.6以前の動作(パケットは接続開始時から可能な限り大きい)が強制されます。

TLSクライアントは、`Config`の`Renegotiation`フィールドを設定することで有効になる、オプションの限定的なサーバー開始再ネゴシエーションのサポートを備えるようになりました。これは、多くのMicrosoft Azureサーバーへの接続に必要なものです。

パッケージによって返されるエラーは、一貫して`tls:`プレフィックスで始まるようになりました。以前のリリースでは、一部のエラーは`crypto/tls:`プレフィックスを使用し、一部は`tls:`プレフィックスを使用し、一部はプレフィックスがまったくありませんでした。

自己署名証明書を生成する場合、パッケージはデフォルトで「Authority Key Identifier」フィールドを設定しなくなりました。

crypto/x509

新しい関数`SystemCertPool`は、利用可能な場合、システム証明書プール全体へのアクセスを提供します。新しい関連エラータイプ`SystemRootsError`も追加されました。

debug/dwarf

`Reader`タイプの新しい`SeekPC`メソッドと`Data`タイプの新しい`Ranges`メソッドは、`LineReader`に渡すコンパイルユニットを見つけること、および特定のプログラムカウンタに対して特定の関数を識別することに役立ちます。

debug/elf

新しい`R_390`リロケーションタイプとその多くの定義済み定数は、S390ポートをサポートします。

encoding/asn1

ASN.1デコーダは、非最小限の整数エンコーディングを拒否するようになりました。これにより、無効であるが以前は受け入れられていたASN.1データが拒否される可能性があります。

encoding/json

`Encoder`の新しい`SetIndent`メソッドは、トップレベルの`Indent`関数のように、JSONエンコーディングのインデントパラメータを設定します。

`Encoder`の新しい`SetEscapeHTML`メソッドは、引用符で囲まれた文字列内の`&`、`<`、`>`文字をそれぞれ`\u0026`、`\u003c`、`\u003e`としてエスケープするかどうかを制御します。以前のリリースと同様に、エンコーダはデフォルトでこのエスケープを適用します。これは、JSONをHTMLに埋め込む際に発生する可能性のある特定の問題を回避するためです。

以前のバージョンのGoでは、このパッケージは文字列型のキーを使用するマップのエンコードとデコードのみをサポートしていました。Go 1.7では、整数型のキーを使用するマップのサポートが追加されました。エンコーディングは、JSONキーとして引用符で囲まれた10進数表現を使用します。Go 1.7では、`MarshalText`(`encoding.TextMarshaler`を参照)メソッドを実装する非文字列キーを使用するマップのエンコードと、`UnmarshalText`(`encoding.TextUnmarshaler`を参照)メソッドを実装する非文字列キーを使用するマップのデコードのサポートも追加されました。これらのメソッドは、以前のバージョンのGoで使用されていたエンコードとデコードを維持するために、文字列型のキーに対しては無視されます。

型付きバイトのスライスをエンコードする場合、Marshal は、存在する場合はそのバイト型の MarshalJSON または MarshalText メソッドを使用してエンコードされた要素の配列を生成するようになりました。どちらのメソッドも使用できない場合のみ、デフォルトのbase64エンコードされた文字列データにフォールバックします。以前のバージョンのGoは、元のbase64エンコードされた文字列エンコーディングと配列エンコーディングの両方を受け入れていました(バイト型が適切にUnmarshalJSONまたはUnmarshalTextも実装していることを前提としています)。そのため、この変更は、選択されたエンコーディングを変更するものの、以前のバージョンのGoとセマンティックに後方互換性があるはずです。

go/build

goコマンドのバイナリのみのパッケージと、cgoベースのパッケージにおけるFortranコードに対する新しいサポートを実装するために、Package型に新しいフィールドBinaryOnlyCgoFFLAGSFFilesが追加されました。

go/doc

上記で説明したgo testの対応する変更をサポートするために、Example構造体に、例が出力行を任意の順序で生成できるかどうかを示すUnorderedフィールドが追加されました。

io

Seekerの実装で使用するための新しい定数SeekStartSeekCurrentSeekEndがパッケージに追加されました。これらの定数は、os.SEEK_SETos.SEEK_CURos.SEEK_ENDよりも優先されますが、後方互換性のために後者は保持されます。

math/big

Float型にGobEncodeメソッドとGobDecodeメソッドが追加されたため、Float型の値をencoding/gobパッケージを使用してエンコードおよびデコードできるようになりました。

math/rand

Read関数とRandReadメソッドは、一貫性があり、入力バッファのサイズに依存しない擬似乱数のバイトストリームを生成するようになりました。

ドキュメントでは、グローバル関数SeedReadは安全ですが(そして常に安全でした)、RandSeedメソッドとReadメソッドは同時に呼び出すことが安全ではないことが明確化されました。

mime/multipart

Writerの実装では、マルチパートセクションのヘッダーがキーでソートされて出力されるようになりました。以前は、マップの反復処理により、セクションヘッダーが非決定的な順序を使用していました。

net

contextの導入の一環として、Dialer型に新しいメソッドDialContextが追加されました。これはDialと似ていますが、ダイアル操作にcontext.Contextを追加します。このコンテキストは、DialerCancelフィールドとDeadlineフィールドを廃止することを目的としていますが、後方互換性のために実装では引き続きそれらを尊重します。

IP型のStringメソッドの無効なIPアドレスに対する結果が変更されました。以前のリリースでは、IPバイトスライスの長さが0、4、または16以外の場合は、String"?"を返していました。Go 1.7では、"?12ab"のように、バイトの16進エンコーディングが追加されました。

純粋なGoの名前解決実装では、DNSルックアップとローカルファイル(つまり、/etc/hosts)ルックアップの優先順位に関して、nsswitch.confで指定された設定が尊重されるようになりました。

net/http

ResponseWriterのドキュメントでは、レスポンスの書き込みを開始すると、リクエストボディの将来の読み取りが妨げられる可能性があることが明確化されました。最大の互換性のために、実装では、レスポンスの一部を書き込む前にリクエストボディを完全に読み取ることをお勧めします。

contextの導入の一環として、Requestに、関連付けられたコンテキストを取得するための新しいメソッドContextと、コンテキストを変更したRequestのコピーを作成するためのWithContextが追加されました。

Serverの実装では、Serveは、キーServerContextKeyを使用して基となる*Serverと、リクエストを受信したローカルアドレス(Addr)をキーLocalAddrContextKeyを使用してリクエストコンテキストに記録します。たとえば、リクエストを受信したアドレスはreq.Context().Value(http.LocalAddrContextKey).(net.Addr)です。

サーバーのServeメソッドは、Server.TLSConfigフィールドがnilであるか、TLSConfig.NextProtosに"h2"が含まれている場合にのみ、HTTP/2サポートを有効にするようになりました。

サーバーの実装では、プロトコルで要求されているように、100未満のレスポンスコードを3桁にパディングするようになりました。そのため、w.WriteHeader(5)はHTTPレスポンスステータス005を使用し、5だけではありません。

サーバーの実装では、RFC 7230に従って、「chunked」が明示的に設定されている場合に、「Transfer-Encoding」ヘッダーを1つだけ送信するようになりました。

サーバーの実装では、無効なHTTPバージョンを持つリクエストの拒否がより厳格になりました。HTTP/0.xであると主張する無効なリクエストは拒否されるようになりました(HTTP/0.9は完全にサポートされていませんでした)。また、「PRI * HTTP/2.0」アップグレードリクエスト以外のプレーンテキストHTTP/2リクエストも拒否されるようになりました。サーバーは暗号化されたHTTP/2リクエストを引き続き処理します。

サーバーでは、タイムアウトハンドラーは空のレスポンスボディに対してステータスコードとして0を返す代わりに、200のステータスコードを返すようになりました。

クライアントでは、Transportの実装は、リモートサーバーに接続するダイアル操作にリクエストコンテキストを渡します。カスタムダイアラが必要な場合は、トランスポートがコンテキストを提供できるように、既存のDialフィールドよりも新しいTransportフィールドDialContextが優先されます。

Transportには、アイドルまたはチャットが多いサーバーによって消費されるクライアントリソースを制御するために、IdleConnTimeoutMaxIdleConnsMaxResponseHeaderBytesフィールドも追加されました。

Clientで設定されたCheckRedirect関数は、最新の転送レスポンスをHTTPリクエストの結果として返す必要があることを示すために、ErrUseLastResponseを返すことができるようになりました。そのレスポンスは、req.ResponseとしてCheckRedirect関数で使用できるようになりました。

Go 1以降、HTTPクライアントのデフォルトの動作は、Accept-Encodingリクエストヘッダーを使用してサーバー側の圧縮を要求し、レスポンスボディを透過的に解凍することです。この動作は、TransportDisableCompressionフィールドを使用して調整できます。Go 1.7では、HTTPプロキシの実装を支援するために、Responseの新しいUncompressedフィールドがこの透過的な解凍が行われたかどうかを報告します。

DetectContentTypeには、いくつかの新しいオーディオおよびビデオコンテンツタイプがサポートされるようになりました。

net/http/cgi

Handlerには、子プロセスの標準エラーをホストプロセスの標準エラーからリダイレクトできる新しいフィールドStderrが追加されました。

net/http/httptest

新しい関数NewRequestは、テスト中にhttp.Handlerに渡すのに適した新しいhttp.Requestを準備します。

ResponseRecorderの新しいResultメソッドは、記録されたhttp.Responseを返します。レスポンスのヘッダーまたはトレーラーを確認する必要があるテストでは、ResponseRecorderHeaderMapに直接アクセスする代わりに、Resultを呼び出してレスポンスフィールドを検査する必要があります。

net/http/httputil

ReverseProxyの実装では、バックエンドに到達できない場合、「502 Bad Gateway」で応答するようになりました。以前のリリースでは、「500 Internal Server Error」で応答していました。

ClientConnServerConnの両方が非推奨として文書化されました。これらは低レベルで古く、Goの現在のHTTPスタックでは使用されておらず、今後更新されません。プログラムでは、代わりにhttp.Clienthttp.Transporthttp.Serverを使用する必要があります。

net/http/pprof

パス/debug/pprof/traceを処理するようにインストールされたランタイムトレースHTTPハンドラーは、secondsクエリパラメーターで分数を受け入れるようになり、1秒未満の間隔のトレースの収集が可能になりました。これは、ビジーなサーバーで特に役立ちます。

net/mail

アドレスパーサーでは、RFC 6532に従って、アドレス内のエスケープされていないUTF-8テキストが許可されるようになりましたが、結果に対して正規化は適用されません。古いメールパーサーとの互換性のために、アドレスエンコーダー、つまりAddressStringメソッドは、RFC 5322に従って、すべてのUTF-8テキストをエスケープし続けます。

ParseAddress関数とAddressParser.Parseメソッドはより厳格になりました。これらは以前はメールアドレスの後の文字を無視していましたが、現在は空白以外の文字に対してエラーを返すようになりました。

net/url

URLの新しいForceQueryフィールドは、クエリ文字列のないURL(/searchなど)と空のクエリ文字列を持つURL(/search?など)を区別するために、URLにクエリ文字列が必要かどうかを記録します。

os

IsExistは、そのエラーが存在するシステムでは、syscall.ENOTEMPTYに対してtrueを返すようになりました。

Windowsでは、Removeは可能な限り読み取り専用ファイルも削除するようになり、実装が非Windowsシステムと同じように動作するようになりました。

os/exec

contextの導入の一環として、新しいコンストラクターCommandContextCommandに似ていますが、コマンド実行をキャンセルするために使用できるコンテキストが含まれています。

os/user

Current関数は、cgoが使用できない場合でも実装されるようになりました。

新しいGroup型と、ルックアップ関数LookupGroupおよびLookupGroupId、そしてUser構造体の新しいフィールドGroupIdsにより、システム固有のユーザーグループ情報へのアクセスが可能になります。

reflect

ValueFieldメソッドは、指定されたフィールド番号iが範囲外の場合にパニックを起こすと常に記述されてきましたが、実際にはサイレントにゼロのValueを返していました。Go 1.7では、このメソッドがドキュメント通りに動作するように変更されました。

新しいStructOf関数は、実行時に構造体型を構築します。これはArrayOfChanOfFuncOfMapOfPtrToSliceOfに加わる、型コンストラクタのセットを完成させます。

StructTagの新しいメソッドLookupGetに似ていますが、指定されたキーを含まないタグと、空文字列を指定されたキーに関連付けるタグを区別します。

TypeValueMethodおよびNumMethodメソッドは、エクスポートされていないメソッドを返したり、カウントしなくなりました。

strings

以前のバージョンのGoでは、ReaderReadメソッドが、残りのデータがない状態でゼロバイトを要求された場合、0のカウントとエラーなしを返していました。現在は0のカウントとio.EOFエラーを返します。

Reader型には、Readerの再利用を可能にする新しいメソッドResetが追加されました。

time

Durationの`time.Duration.String`メソッドは、ゼロのdurationを"0"ではなく"0s"として報告するようになりました。ParseDurationは引き続き両方の形式を受け入れます。

メソッド呼び出しtime.Local.String()は、すべてのシステムで"Local"を返すようになりました。以前のリリースでは、Windowsで空文字列を返していました。

$GOROOT/lib/time内のタイムゾーンデータベースがIANAリリース2016dに更新されました。このフォールバックデータベースは、システムのタイムゾーンデータベースが見つからない場合(Windowsなど)にのみ使用されます。Windowsのタイムゾーン略語リストも更新されました。

syscall

Linuxでは、SysProcAttr構造体(os/exec.CmdSysProcAttrフィールドで使用される)に新しいUnshareflagsフィールドが追加されました。このフィールドがゼロ以外の場合、ForkExecexec.CmdRunメソッドで使用される)によって作成された子プロセスは、新しいプログラムを実行する前にunshare(2)システムコールを呼び出します。

unicode

unicodeパッケージとシステム全体にわたる関連するサポートがバージョン8.0からUnicode 9.0にアップグレードされました。