前書き
Go 1.7 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.7 Release Notes
次のバージョン:Go1.8のリリースノート(日本語訳)
前のバージョン:Go1.6のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.7の紹介
最新のGoリリースであるバージョン1.7は、1.6の6か月後に登場しました。変更のほとんどはツールチェーン、ランタイム、およびライブラリの実装にあります。言語仕様には1つの小さな変更があります。リリースは常にGo 1の互換性の約束 を維持しています。ほとんどすべてのGoプログラムがこれまで通りにコンパイルおよび実行されることを期待しています。
このリリースでは、IBM LinuxOneへのポートを追加 し、x86-64コンパイラのバックエンドを更新 してより効率的なコードを生成し、標準ライブラリで使用されるx/netサブリポジトリ から昇格したcontextパッケージ を含み、テストとベンチマークの階層を作成するためのテストパッケージのサポートを追加 しました。また、Go 1.5で開始されたベンダリングサポートを最終化 し、標準機能としました。
言語の変更
このリリースには1つの小さな言語変更があります。終了ステートメント
のセクションでは、ステートメントリストが終了ステートメントで終わるかどうかを判断するために、「最後の非空ステートメント」が終了と見なされることが明確にされています。これは、既存のgc
およびgccgo
コンパイラツールチェーンの動作と一致しています。以前のリリースでは、定義は「最後のステートメント」のみを参照しており、末尾の空のステートメントの影響が不明確でした。この点で、go/types
パッケージがgc
およびgccgo
コンパイラツールチェーンに一致するように更新されました。この変更は、既存のプログラムの正確性には影響しません。
ポート
Go 1.7はmacOS 10.12 Sierraをサポートします。1.7以前のバージョンでビルドされたバイナリは、Sierraで正しく動作しません。Go 1.7は、Linux on z Systems
(linux/s390x)への実験的なポートと、Plan 9 on ARM(plan9/arm)へのポートの開始を追加しました。Go 1.6で追加された64ビットMIPS(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年の提案
に基づいて開発されてきました。新しいバックエンドは、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
を使用するパッケージには、C、C++、Objective C、およびSWIGに加えて、Fortranソースファイルを含めることができるようになりましたが、Goバインディングは依然としてC言語APIを使用する必要があります。Goバインディングは、新しいヘルパー関数C.CBytes
を使用できるようになりました。C.CString
がGo文字列を取り、*C.byte
(Cのchar*
)を返すのに対し、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には、おそらくgccgoのGo 1.8バージョンが含まれるでしょう。
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 tool dist
新しいサブコマンド「go tool dist list」は、サポートされているすべてのオペレーティングシステム/アーキテクチャのペアを出力します。
Go tool trace
Go 1.5で導入された 「go tool trace」コマンドは、さまざまな方法で改良されました。まず、トレースの収集は過去のリリースよりも大幅に効率的になりました。このリリースでは、トレースを収集する際の典型的な実行時間のオーバーヘッドは約25%です。過去のリリースでは少なくとも400%でした。第二に、トレースファイルにはファイルと行番号の情報が含まれるようになり、トレースツールを実行する際に元の実行可能ファイルがオプションになります。第三に、トレースツールは大きなトレースを分割して、ブラウザベースのビューアの制限を回避します。このリリースではトレースファイル形式が変更されましたが、Go 1.7ツールは以前のリリースのトレースを引き続き読み取ることができます。
パフォーマンス
常にそうであるように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を出すことは困難です。ほとんどのプログラムは、ガベージコレクタの速度向上とコアライブラリの最適化により、少し速く実行されるはずです。x86-64システムでは、新しいコンパイラバックエンドによって生成されたコードの改善により、多くのプログラムが大幅に高速に実行されます。上記のように、独自のベンチマークでは、コード生成の変更だけでプログラムのCPU時間が通常5-35%削減されます。10%以上の改善をもたらす重要な最適化があり、次のパッケージの実装に影響を与えています:crypto/sha1 、crypto/sha256 、encoding/binary 、fmt 、hash/adler32 、hash/crc32 、hash/crc64 、image/color 、math/big 、strconv 、strings 、unicode 、およびunicode/utf16 パッケージ。ガベージコレクションの停止時間は、アイドル状態のゴルーチンが多数あるプログラム、大きなスタックサイズの変動、または大きなパッケージレベルの変数を持つプログラムでは、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 を導入しました。
テスト
テストパッケージは、サブテストとサブベンチマークを持つテストの定義をサポートするようになりました。このサポートにより、テーブル駆動のベンチマークを簡単に作成し、階層的なテストを作成できます。また、共通のセットアップとティアダウンコードを共有する方法も提供します。詳細はパッケージドキュメント を参照してください。
ランタイム
ランタイムによって開始されたすべてのパニックは、言語仕様で要求されている
ように、builtin
のerror
とruntime.Error
の両方を実装するパニック値を使用するようになりました。パニック中に、シグナルの名前がわかっている場合は、スタックトレースに表示されます。それ以外の場合は、Go 1.7以前と同様にシグナルの番号が使用されます。新しい関数KeepAlive
は、プログラムの特定のポイントで割り当てられたオブジェクトが到達可能と見なされる必要があることを宣言するための明示的なメカニズムを提供します。通常、関連するファイナライザの実行を遅らせるためです。新しい関数CallersFrames
は、Callers
から取得したPCスライスを、コールスタックに対応するフレームのシーケンスに変換します。この新しいAPIは、インライン関数呼び出しを含むコールスタックをより正確に記述できるため、FuncForPC
の直接使用の代わりに推奨されます。新しい関数SetCgoTraceback
は、同じプロセスで実行される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
新しい関数ContainsAny
とContainsRune
が、strings
パッケージとの対称性のために追加されました。以前のGoのリリースでは、Reader
のRead
メソッドがデータが残っていない状態でゼロバイトを要求された場合、カウント0とエラーなしを返していました。現在は、カウント0とエラーio.EOF
を返します。Reader
型には、新しいメソッドReset
が追加され、Reader
の再利用を可能にします。
compress/flate
パッケージ全体に多くのパフォーマンス最適化があります。デコンプレッション速度は約10%向上し、DefaultCompression
の圧縮は2倍の速さになりました。これらの一般的な改善に加えて、BestSpeed
コンプレッサは完全に置き換えられ、Snappy
に似たアルゴリズムを使用し、約2.5倍の速度向上を実現しましたが、出力は以前のアルゴリズムよりも5-10%大きくなる可能性があります。また、新しい圧縮レベルHuffmanOnly
が追加され、ハフマンエンコーディングのみを適用し、ランプルジブエンコーディングを適用しません。ランプルジブエンコーディングを省略する
ことで、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
は、JSONエンコーディングのインデントパラメータを設定し、トップレベルのIndent
関数のように動作します。Encoder
の新しいメソッドSetEscapeHTML
は、引用符で囲まれた文字列内の&
、<
、および>
文字をそれぞれ\u0026
、\u003c
、および\u003e
としてエスケープするかどうかを制御します。以前のリリースと同様に、エンコーダはデフォルトでこのエスケープを適用し、HTMLにJSONを埋め込む際に発生する可能性のある特定の問題を回避します。以前のバージョンの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
パッケージに新しい定数SeekStart
、SeekCurrent
、およびSeekEnd
が追加され、Seeker
実装で使用されます。これらの定数は、os.SEEK_SET
、os.SEEK_CUR
、およびos.SEEK_END
よりも推奨されますが、後者は互換性のために保持されます。
math/big
Float
型にGobEncode
およびGobDecode
メソッドが追加され、Float
型の値をencoding/gob
パッケージを使用してエンコードおよびデコードできるようになりました。
math/rand
Read
関数とRand
のRead
メソッドは、入力バッファのサイズに依存しない一貫した疑似ランダムなバイトストリームを生成するようになりました。ドキュメントは、Rand
のSeed
およびRead
メソッドが同時に呼び出されるのが安全でないことを明確にしていますが、グローバル関数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は、バイトの16進エンコーディングを追加し、"?12ab"のようにします。純粋なGoの名前解決
の実装は、nsswitch.conf
のDNSルックアップの優先順位に対する優先順位を尊重するようになりました。
net/http
ResponseWriter
のドキュメントは、応答の書き込みを開始すると、リクエストボディの将来の読み取りが妨げられる可能性があることを明確にしています。最大の互換性を確保するために、実装は応答の一部を書き込む前にリクエストボディを完全に読み取ることをお勧めします。context
の導入の一環として、Request
には新しいメソッドContext
が追加され、関連するコンテキストを取得し、WithContext
が追加され、変更されたコンテキストを持つRequest
のコピーを構築します。Server
の実装では、Serve
はリクエストコンテキストに基づいて、基になる*Server
をServerContextKey
キーを使用して記録し、リクエストが受信されたローカルアドレス(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ではありません。サーバーの実装は、chunked
が明示的に設定されている場合に、1つのTransfer-Encoding
ヘッダーのみを正しく送信するようになりました。RFC 7230
に従います。サーバーの実装は、無効なHTTPバージョンを持つリクエストを拒否することに関して、より厳格になりました。HTTP/0.xを主張する無効なリクエストは拒否されるようになりました(HTTP/0.9は完全にサポートされていませんでした)、"PRI * HTTP/2.0"
アップグレードリクエスト以外のプレーンテキストHTTP/2リクエストも拒否されるようになりました。サーバーは引き続き暗号化されたHTTP/2リクエストを処理します。サーバーでは、タイムアウトハンドラーが空の応答ボディで200ステータスコードを返すようになり、ステータスコード0を返す代わりに。クライアントでは、Transport
の実装はリクエストコンテキストをリモートサーバーへの接続に使用するダイヤル操作に渡します。カスタムダイヤラーが必要な場合、新しいTransport
フィールドDialContext
が既存のDial
フィールドよりも優先され、トランスポートがコンテキストを提供できるようにします。Transport
は、IdleConnTimeout
、MaxIdleConns
、およびMaxResponseHeaderBytes
フィールドも追加し、アイドルまたはチャットサーバーによって消費されるクライアントリソースを制御するのに役立ちます。Client
の設定されたCheckRedirect
関数は、HTTPリクエストの結果として最新のリダイレクト応答を返すべきであることを示すためにErrUseLastResponse
を返すことができるようになりました。その応答は、CheckRedirect
関数にreq.Response
として利用可能です。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
を返します。応答のヘッダーやトレーラーをチェックする必要があるテストは、Result
を呼び出して応答フィールドを検査し、ResponseRecorder
のHeaderMap
に直接アクセスする代わりに行うべきです。
net/http/httputil
ReverseProxy
の実装は、バックエンドに到達できない場合に「502 Bad Gateway」で応答するようになりました。以前のリリースでは「500 Internal Server Error」で応答していました。ClientConn
とServerConn
は非推奨として文書化されています。これらは低レベルで古く、Goの現在のHTTPスタックでは使用されておらず、今後更新されることはありません。プログラムは、http.Client
、http.Transport
、およびhttp.Server
を使用するべきです。
net/http/pprof
ランタイムトレースHTTPハンドラーは、パス/debug/pprof/trace
を処理するためにインストールされ、seconds
クエリパラメータに小数を受け入れるようになり、1秒未満の間隔でトレースを収集できるようになりました。これは特に忙しいサーバーで役立ちます。
net/mail
アドレスパーサーは、RFC 6532
に従って、アドレス内のエスケープされていないUTF-8テキストを許可するようになりましたが、結果に対して正規化を適用しません。古いメールパーサーとの互換性のために、アドレスエンコーダー、つまりAddress
のString
メソッドは、RFC 5322
に従ってすべてのUTF-8テキストをエスケープし続けます。ParseAddress
関数とAddressParser.Parse
メソッドはより厳格になりました。これらは、メールアドレスの後に続く文字を無視していましたが、現在は空白以外のものに対してエラーを返します。
net/url
URL
の新しいForceQuery
フィールドは、URLにクエリ文字列が必要かどうかを記録し、クエリ文字列のないURL(/search
のようなもの)と空のクエリ文字列を持つURL(/search?
のようなもの)を区別します。
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
型には、新しいメソッドReset
が追加され、Reader
の再利用を可能にします。
time
Duration
のtime.Duration.String
メソッドは、ゼロ期間を"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
にアップグレードされました。