Go1.7のリリースノート(日本語訳)

JavaScriptを有効にしてください

前書き

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 16136issue 15658 、およびissue 16396 を参照してください。これらのFreeBSD固有の問題の解決に役立つ情報をお待ちしています。

ツール

アセンブラ

64ビットARMシステムでは、ベクトルレジスタの名前がV0からV31に修正されました。以前のリリースでは、誤ってV32からV63と呼ばれていました。64ビットx86システムでは、次の命令が追加されました:PCMPESTRIRORXLRORXQVINSERTI128VPADDDVPADDQVPALIGNRVPBLENDDVPERM2F128VPERM2I128VPORVPSHUFBVPSHUFDVPSLLDVPSLLDQVPSLLQVPSRLDVPSRLDQ、および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.bashmake.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パッケージ(下記 参照)のWithCancelWithTimeout、および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/sha1crypto/sha256encoding/binaryfmthash/adler32hash/crc32hash/crc64image/colormath/bigstrconvstringsunicode 、およびunicode/utf16 パッケージ。ガベージコレクションの停止時間は、アイドル状態のゴルーチンが多数あるプログラム、大きなスタックサイズの変動、または大きなパッケージレベルの変数を持つプログラムでは、Go 1.6よりも大幅に短くなるはずです。

標準ライブラリ

コンテキスト

Go 1.7は、golang.org/x/net/contextパッケージを標準ライブラリとしてcontext に移動しました。これにより、キャンセル、タイムアウト、および他の標準ライブラリパッケージでのリクエストスコープデータの渡しにコンテキストを使用できるようになります。これには、netnet/http 、およびos/exec が含まれます。コンテキストに関する詳細情報は、パッケージドキュメント およびGoブログの投稿「Go Concurrent Patterns: Context 」を参照してください。

HTTPトレース

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

テスト

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

ランタイム

ランタイムによって開始されたすべてのパニックは、言語仕様で要求されている ように、builtinerrorruntime.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のリリースでは、ReaderPeekメソッドが基になるバッファに収まる以上のバイトを要求された場合、空のスライスとエラーErrBufferFullを返していました。現在は、基になるバッファ全体を返し、エラーErrBufferFullを伴います。

bytes

新しい関数ContainsAnyContainsRuneが、stringsパッケージとの対称性のために追加されました。以前のGoのリリースでは、ReaderReadメソッドがデータが残っていない状態でゼロバイトを要求された場合、カウント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%大きい圧縮出力を生成するコストがあります。重要なのは、BestSpeedHuffmanOnlyの両方がRFC 1951 に準拠した圧縮出力を生成することです。つまり、有効なDEFLATEデコンプレッサはこれらの出力を引き続きデコンプレッションできます。最後に、デコンプレッサのio.Readerの実装に小さな変更があります。以前のバージョンでは、デコンプレッサは正確にこれ以上バイトを読み取れなくなるまでio.EOFの報告を延期していました。現在は、最後のバイトセットを読み取るときにio.EOFをより早く報告します。

crypto/tls

TLS実装は、各接続の最初の数データパケットを小さなレコードサイズで送信し、徐々にTLSの最大レコードサイズに増加させます。このヒューリスティックは、最初のパケットを復号化する前に受信する必要があるデータ量を減らし、低帯域幅ネットワークでの通信遅延を改善します。ConfigDynamicRecordSizingDisabledフィールドをtrueに設定すると、接続の開始時からパケットが可能な限り大きくなるGo 1.6以前の動作を強制します。TLSクライアントは、サーバーによって開始される再ネゴシエーションのオプションの限定サポートを持ち、ConfigRenegotiationフィールドを設定することで有効になります。これは、多くのMicrosoft Azureサーバーに接続するために必要です。パッケージによって返されるエラーは、tls:プレフィックスで一貫して始まるようになりました。過去のリリースでは、一部のエラーはcrypto/tls:プレフィックスを使用し、一部はtls:プレフィックスを使用し、一部はプレフィックスがありませんでした。自己署名証明書を生成する際、パッケージはデフォルトで「Authority Key Identifier」フィールドを設定しなくなりました。

crypto/x509

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

debug/dwarf

Reader型の新しいメソッドSeekPCData型の新しいメソッド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型に新しいフィールドBinaryOnlyCgoFFLAGS、およびFFilesが追加されました。

go/doc

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

io

パッケージに新しい定数SeekStartSeekCurrent、およびSeekEndが追加され、Seeker実装で使用されます。これらの定数は、os.SEEK_SETos.SEEK_CUR、およびos.SEEK_ENDよりも推奨されますが、後者は互換性のために保持されます。

math/big

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

math/rand

Read関数とRandReadメソッドは、入力バッファのサイズに依存しない一貫した疑似ランダムなバイトストリームを生成するようになりました。ドキュメントは、RandSeedおよびReadメソッドが同時に呼び出されるのが安全でないことを明確にしていますが、グローバル関数SeedおよびReadは(常に)安全です。

mime/multipart

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

net

context の導入の一環として、Dialer型に新しいメソッドDialContextが追加されました。これはDialに似ていますが、ダイヤル操作にcontext.Contextを追加します。コンテキストは、DialerCancelおよび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はリクエストコンテキストに基づいて、基になる*ServerServerContextKeyキーを使用して記録し、リクエストが受信されたローカルアドレス(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は、IdleConnTimeoutMaxIdleConns、およびMaxResponseHeaderBytesフィールドも追加し、アイドルまたはチャットサーバーによって消費されるクライアントリソースを制御するのに役立ちます。Clientの設定されたCheckRedirect関数は、HTTPリクエストの結果として最新のリダイレクト応答を返すべきであることを示すためにErrUseLastResponseを返すことができるようになりました。その応答は、CheckRedirect関数にreq.Responseとして利用可能です。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を返します。応答のヘッダーやトレーラーをチェックする必要があるテストは、Resultを呼び出して応答フィールドを検査し、ResponseRecorderHeaderMapに直接アクセスする代わりに行うべきです。

net/http/httputil

ReverseProxyの実装は、バックエンドに到達できない場合に「502 Bad Gateway」で応答するようになりました。以前のリリースでは「500 Internal Server Error」で応答していました。ClientConnServerConnは非推奨として文書化されています。これらは低レベルで古く、Goの現在のHTTPスタックでは使用されておらず、今後更新されることはありません。プログラムは、http.Clienthttp.Transport、およびhttp.Serverを使用するべきです。

net/http/pprof

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

net/mail

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

ValueFieldメソッドは、与えられたフィールド番号iが範囲外の場合にパニックを起こすと常に文書化されていましたが、代わりにゼロValueを静かに返していました。Go 1.7は、メソッドを文書化されたとおりに動作するように変更しました。新しいStructOf関数は、実行時に構造体型を構築します。これは、ArrayOfChanOfFuncOfMapOfPtrTo、およびSliceOfに加わり、型コンストラクタのセットを完成させます。StructTagの新しいメソッドLookupは、Getに似ていますが、指定されたキーを含まないタグと、指定されたキーに空の文字列を関連付けるタグを区別します。TypeValueMethodおよびNumMethodメソッドは、非公開メソッドを返したりカウントしたりしなくなりました。

strings

以前のGoのリリースでは、ReaderReadメソッドがデータが残っていない状態でゼロバイトを要求された場合、カウント0とエラーなしを返していました。現在は、カウント0とエラーio.EOFを返します。Reader型には、新しいメソッドResetが追加され、Readerの再利用を可能にします。

time

Durationtime.Duration.Stringメソッドは、ゼロ期間を"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 にアップグレードされました。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア