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 Systems(linux/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 16136、issue 15658、およびissue 16396を参照してください。これらのFreeBSD固有の問題の解決に協力していただければ幸いです。
ツール
アセンブラ
64ビットARMシステムの場合、ベクトルレジスタ名はV0
からV31
に修正されました。以前のリリースでは、誤ってV32
からV63
と呼ばれていました。
64ビットx86システムの場合、次の命令が追加されました:PCMPESTRI
、RORXL
、RORXQ
、VINSERTI128
、VPADDD
、VPADDQ
、VPALIGNR
、VPBLENDD
、VPERM2F128
、VPERM2I128
、VPOR
、VPSHUFB
、VPSHUFD
、VPSLLD
、VPSLLDQ
、VPSLLQ
、VPSRLD
、VPSRLDQ
、および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.bash
、make.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`として移動されました。これにより、キャンセル、タイムアウト、およびリクエストスコープデータの受け渡しを、net、net/http、os/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
型に新しいフィールドBinaryOnly
、CgoFFLAGS
、FFiles
が追加されました。
go/doc
上記で説明したgo test
の対応する変更をサポートするために、Example
構造体に、例が出力行を任意の順序で生成できるかどうかを示すUnordered
フィールドが追加されました。
io
Seeker
の実装で使用するための新しい定数SeekStart
、SeekCurrent
、SeekEnd
がパッケージに追加されました。これらの定数は、os.SEEK_SET
、os.SEEK_CUR
、os.SEEK_END
よりも優先されますが、後方互換性のために後者は保持されます。
math/big
Float
型にGobEncode
メソッドとGobDecode
メソッドが追加されたため、Float
型の値をencoding/gob
パッケージを使用してエンコードおよびデコードできるようになりました。
math/rand
Read
関数とRand
のRead
メソッドは、一貫性があり、入力バッファのサイズに依存しない擬似乱数のバイトストリームを生成するようになりました。
ドキュメントでは、グローバル関数Seed
とRead
は安全ですが(そして常に安全でした)、Rand
のSeed
メソッドとRead
メソッドは同時に呼び出すことが安全ではないことが明確化されました。
mime/multipart
Writer
の実装では、マルチパートセクションのヘッダーがキーでソートされて出力されるようになりました。以前は、マップの反復処理により、セクションヘッダーが非決定的な順序を使用していました。
net
contextの導入の一環として、Dialer
型に新しいメソッドDialContext
が追加されました。これはDial
と似ていますが、ダイアル操作にcontext.Context
を追加します。このコンテキストは、Dialer
のCancel
フィールドと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
には、アイドルまたはチャットが多いサーバーによって消費されるクライアントリソースを制御するために、IdleConnTimeout
、MaxIdleConns
、MaxResponseHeaderBytes
フィールドも追加されました。
Client
で設定されたCheckRedirect
関数は、最新の転送レスポンスをHTTPリクエストの結果として返す必要があることを示すために、ErrUseLastResponse
を返すことができるようになりました。そのレスポンスは、req.Response
としてCheckRedirect
関数で使用できるようになりました。
Go 1以降、HTTPクライアントのデフォルトの動作は、Accept-Encoding
リクエストヘッダーを使用してサーバー側の圧縮を要求し、レスポンスボディを透過的に解凍することです。この動作は、Transport
のDisableCompression
フィールドを使用して調整できます。Go 1.7では、HTTPプロキシの実装を支援するために、Response
の新しいUncompressed
フィールドがこの透過的な解凍が行われたかどうかを報告します。
DetectContentType
には、いくつかの新しいオーディオおよびビデオコンテンツタイプがサポートされるようになりました。
net/http/cgi
Handler
には、子プロセスの標準エラーをホストプロセスの標準エラーからリダイレクトできる新しいフィールドStderr
が追加されました。
net/http/httptest
新しい関数NewRequest
は、テスト中にhttp.Handler
に渡すのに適した新しいhttp.Request
を準備します。
ResponseRecorder
の新しいResult
メソッドは、記録されたhttp.Response
を返します。レスポンスのヘッダーまたはトレーラーを確認する必要があるテストでは、ResponseRecorder
のHeaderMap
に直接アクセスする代わりに、Result
を呼び出してレスポンスフィールドを検査する必要があります。
net/http/httputil
ReverseProxy
の実装では、バックエンドに到達できない場合、「502 Bad Gateway」で応答するようになりました。以前のリリースでは、「500 Internal Server Error」で応答していました。
ClientConn
とServerConn
の両方が非推奨として文書化されました。これらは低レベルで古く、Goの現在のHTTPスタックでは使用されておらず、今後更新されません。プログラムでは、代わりにhttp.Client
、http.Transport
、http.Server
を使用する必要があります。
net/http/pprof
パス/debug/pprof/trace
を処理するようにインストールされたランタイムトレースHTTPハンドラーは、seconds
クエリパラメーターで分数を受け入れるようになり、1秒未満の間隔のトレースの収集が可能になりました。これは、ビジーなサーバーで特に役立ちます。
net/mail
アドレスパーサーでは、RFC 6532に従って、アドレス内のエスケープされていないUTF-8テキストが許可されるようになりましたが、結果に対して正規化は適用されません。古いメールパーサーとの互換性のために、アドレスエンコーダー、つまりAddress
のString
メソッドは、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の導入の一環として、新しいコンストラクターCommandContext
はCommand
に似ていますが、コマンド実行をキャンセルするために使用できるコンテキストが含まれています。
os/user
Current
関数は、cgoが使用できない場合でも実装されるようになりました。
新しいGroup
型と、ルックアップ関数LookupGroup
およびLookupGroupId
、そしてUser
構造体の新しいフィールドGroupIds
により、システム固有のユーザーグループ情報へのアクセスが可能になります。
reflect
Value
のField
メソッドは、指定されたフィールド番号i
が範囲外の場合にパニックを起こすと常に記述されてきましたが、実際にはサイレントにゼロのValue
を返していました。Go 1.7では、このメソッドがドキュメント通りに動作するように変更されました。
新しいStructOf
関数は、実行時に構造体型を構築します。これはArrayOf
、ChanOf
、FuncOf
、MapOf
、PtrTo
、SliceOf
に加わる、型コンストラクタのセットを完成させます。
StructTag
の新しいメソッドLookup
はGet
に似ていますが、指定されたキーを含まないタグと、空文字列を指定されたキーに関連付けるタグを区別します。
Type
とValue
のMethod
およびNumMethod
メソッドは、エクスポートされていないメソッドを返したり、カウントしなくなりました。
strings
以前のバージョンのGoでは、Reader
のRead
メソッドが、残りのデータがない状態でゼロバイトを要求された場合、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.Cmd
のSysProcAttr
フィールドで使用される)に新しいUnshareflags
フィールドが追加されました。このフィールドがゼロ以外の場合、ForkExec
(exec.Cmd
のRun
メソッドで使用される)によって作成された子プロセスは、新しいプログラムを実行する前にunshare(2)システムコールを呼び出します。
unicode
unicode
パッケージとシステム全体にわたる関連するサポートがバージョン8.0からUnicode 9.0にアップグレードされました。