Go 1.8 リリースノート

Go 1.8の紹介

最新のGoリリースであるバージョン1.8は、Go 1.7から6か月後にリリースされました。変更のほとんどは、ツールチェーン、ランタイム、およびライブラリの実装に関するものです。言語仕様には2つの小さな変更があります。いつものように、リリースはGo 1の互換性の約束を維持しています。ほぼすべてのGoプログラムがこれまでどおりにコンパイルおよび実行されると予想されます。

このリリースでは、32ビットMIPSのサポートが追加され、コンパイラのバックエンドが更新されてより効率的なコードが生成され、ストップザワールドスタックの再スキャンを排除することでGCの一時停止が減少しHTTP/2プッシュのサポートが追加され、HTTPの正常なシャットダウンが追加され、より多くのコンテキストサポートが追加され、ミューテックスのプロファイリングが可能になりスライスのソートが簡略化されました。

言語への変更

Go 1.8以降、ある構造体型から別の構造体型へ値を明示的に変換する場合、タグは無視されます。したがって、タグのみが異なる2つの構造体は、一方から他方に変換できます。

func example() {
    type T1 struct {
        X int `json:"foo"`
    }
    type T2 struct {
        X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // now legal
}

言語仕様では、実装が浮動小数点定数で最大16ビットの指数をサポートすることのみが要求されるようになりました。これは、「gc」コンパイラとgccgoコンパイラの両方には影響しません。どちらのコンパイラも依然として32ビットの指数をサポートしています。

ポート

Goは、FPUまたはカーネルFPUエミュレーションを備えたMIPS32r1命令セットを実装するビッグエンディアン(linux/mips)とリトルエンディアン(linux/mipsle)マシンの両方に対して、Linuxで32ビットMIPSをサポートするようになりました。多くの一般的なMIPSベースのルーターにはFPUがなく、カーネルFPUエミュレーションを有効にしないファームウェアがあることに注意してください。Goはこのようなマシンでは実行されません。

DragonFly BSDでは、GoはDragonFly 4.4.4以降を必要とするようになりました。

OpenBSDでは、GoはOpenBSD 5.9以降を必要とするようになりました。

Plan 9ポートのネットワークサポートが大幅に改善され、デッドラインとキャンセルに関してUnixおよびWindowsの動作と一致するようになりました。Plan 9カーネルの要件については、Plan 9 wikiページを参照してください。

Go 1.8は、OS X 10.8以降のみをサポートするようになりました。これは10.8をサポートする最後のGoリリースになる可能性があります。古いOS XバージョンでのGoのコンパイルまたはバイナリの実行はテストされていません。

Go 1.8は、ARMv5EおよびARMv6プロセッサでLinuxをサポートする最後のリリースになります。Go 1.9では、ARMv6K(Raspberry Pi 1に搭載されている)以降が必要になる可能性があります。LinuxシステムがARMv6K以降かどうかを識別するには、「go tool dist -check-armv6k」を実行します(テストを容易にするために、Go 1.8のフルコピーをインストールせずに、distコマンドをシステムにコピーすることも可能です)。プログラムが「ARMv6K supported.」という出力で終了した場合、システムはARMv6K以降を実装しています。非Linux ARMシステムでのGoは、すでにARMv6K以降を必要としています。

zosは、z/OSオペレーティングシステム用に予約された、GOOSの認識される値になりました。

既知の問題

FreeBSDとNetBSDには、認識されているが理解されていないいくつかの不安定性があります。これらは、まれにプログラムのクラッシュにつながる可能性があります。issue 15658issue 16511を参照してください。これらの問題の解決にご協力いただければ幸いです。

ツール

アセンブラ

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

64ビットPPCシステムの場合、一般的なベクトルスカラ命令が追加されました: LXSLXSDXLXSILXSIWAXLXSIWZXLXVLXVD2XLXVDSXLXVW4XMFVSRMFVSRDMFVSRWZMTVSRMTVSRDMTVSRWAMTVSRWZSTXSSTXSDXSTXSISTXSIWXSTXVSTXVD2XSTXVW4XXSCVXSCVDPSPXSCVDPSPNXSCVDPSXDSXSCVDPSXWSXSCVDPUXDSXSCVDPUXWSXSCVSPDPXSCVSPDPNXSCVSXDDPXSCVSXDSPXSCVUXDDPXSCVUXDSPXSCVXXSCVXPXVCVXVCVDPSPXVCVDPSXDSXVCVDPSXWSXVCVDPUXDSXVCVDPUXWSXVCVSPDPXVCVSPSXDSXVCVSPSXWSXVCVSPUXDSXVCVSPUXWSXVCVSXDDPXVCVSXDSPXVCVSXWDPXVCVSXWSPXVCVUXDDPXVCVUXDSPXVCVUXWDPXVCVUXWSPXVCVXXVCVXPXXLANDXXLANDCXXLANDQXXLEQVXXLNANDXXLNORXXLORXXLORCXXLORQXXLXORXXMRGXXMRGHWXXMRGLWXXPERMXXPERMDIXXSELXXSIXXSLDWIXXSPLT、およびXXSPLTW

Yacc

yaccツール(以前は「go tool yacc」を実行することで使用可能)は削除されました。Go 1.7以降、Goコンパイラでは使用されなくなりました。これは「tools」リポジトリに移動し、golang.org/x/tools/cmd/goyaccで利用できるようになりました。

Fix

fixツールには、インポートを「golang.org/x/net/context」から「context」に変更するための新しい「context」fixがあります。

Pprof

pprofツールは、「https+insecure」URLスキームを使用することで、TLSサーバーをプロファイリングし、証明書の検証をスキップできるようになりました。

callgrind出力には、命令レベルの粒度が含まれるようになりました。

Trace

traceツールには、実行トレースからpprof互換のブロッキングおよびレイテンシプロファイルを生成するための新しい-pprofフラグがあります。

ガベージコレクションイベントが、実行トレースビューアでより明確に表示されるようになりました。ガベージコレクションアクティビティは独自の行に表示され、GCヘルパーゴルーチンは役割が注釈付けされます。

Vet

Vetは、いくつかの点でより厳密になり、以前に誤検出を引き起こしていた箇所では緩くなりました。

Vetは、ロックの配列のコピー、重複するJSONおよびXML構造体フィールドタグ、スペースで区切られていない構造体タグ、エラーをチェックする前のHTTP Response.Body.Closeへの遅延呼び出し、およびPrintfのインデックス付き引数をチェックするようになりました。また、既存のチェックも改善されています。

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

Go 1.7では、64ビットx86システム用の新しいコンパイラバックエンドが導入されました。Go 1.8では、そのバックエンドがさらに開発され、すべてのアーキテクチャで使用されるようになりました。

静的単一代入形式 (SSA)に基づく新しいバックエンドは、よりコンパクトで効率的なコードを生成し、境界チェックの排除などの最適化のためのより良いプラットフォームを提供します。新しいバックエンドは、32ビットARMシステムでのベンチマークプログラムに必要なCPU時間を20〜30%削減します。Go 1.7ですでにSSAバックエンドを使用していた64ビットx86システムの場合、ゲインは0〜10%と控えめです。他のアーキテクチャでは、32ビットARMの数値に近い改善が見られる可能性があります。

Go 1.7で導入された新しいバックエンドを無効にするための一時的な-ssa=0コンパイラフラグは、Go 1.8で削除されました。

すべてのシステムで新しいコンパイラバックエンドを有効にするだけでなく、Go 1.8では新しいコンパイラフロントエンドも導入されています。新しいコンパイラフロントエンドはユーザーには目立たないはずですが、将来のパフォーマンス作業の基礎となります。

コンパイラとリンカーは最適化されており、このリリースではGo 1.7よりも高速に実行されますが、依然として期待どおりの速度よりも遅く、将来のリリースで引き続き最適化されます。以前のリリースと比較して、Go 1.8は約15%高速です。

Cgo

Goツールは、make.bashで設定されたCGO_ENABLED環境変数の値を記憶し、問題#12808を修正するために、デフォルトですべての将来のコンパイルに適用するようになりました。ネイティブコンパイルを行う場合、make.bashが正しい設定を自動的に検出するため、CGO_ENABLED環境変数を明示的に設定する必要はほとんどありません。CGO_ENABLED環境変数を明示的に設定する主な理由は、環境がcgoをサポートしているが、cgoサポートを明示的に必要としない場合です。この場合は、make.bashまたはall.bash中にCGO_ENABLED=0を設定します。

PKG_CONFIG環境変数は、#cgo pkg-configディレクティブを処理するために実行するプログラムを設定するために使用できるようになりました。デフォルトはpkg-configであり、以前のリリースで常に使用されていたプログラムです。これは、cgoコードのクロスコンパイルを容易にすることを目的としています。

cgoツールは、goコマンドで使用される-srcdirオプションをサポートするようになりました。

cgoコードがC.mallocを呼び出し、mallocNULLを返した場合、プログラムはメモリ不足エラーでクラッシュするようになりました。C.mallocnilを返すことはありません。ほとんどのC関数とは異なり、C.mallocはerrno値を返す2結果形式では使用できません。

cgoを使用して、C共用体へのポインタを渡すC関数を呼び出す場合、C共用体は任意のポインタ値を含めることができ、cgoポインタチェックが有効になっている場合(デフォルトでは有効)、共用体値はGoポインタについてチェックされます。

Gccgo

Goの半期ごとのリリーススケジュールとGCCの年次リリーススケジュールが合致したため、GCCリリース6にはgccgoのGo 1.6.1バージョンが含まれています。次のリリースであるGCC 7には、gccgoのGo 1.8バージョンが含まれる見込みです。

デフォルトのGOPATH

GOPATH 環境変数が設定されていない場合、デフォルト値を持つようになりました。Unixでは $HOME/go、Windowsでは %USERPROFILE%/go がデフォルト値となります。

Go get

go get” コマンドは、-insecure フラグが使用されているかどうかに関わらず、HTTPプロキシ環境変数を常に尊重するようになりました。以前のリリースでは、-insecure フラグにプロキシを使用しないという副作用がありました。

Go bug

新しい “go bug” コマンドは、現在のシステムに関する情報が事前に入力された状態で、GitHubでバグレポートを開始します。

Go doc

go doc” コマンドは、godoc の動作に従い、定数と変数を型ごとにグループ化するようになりました。

doc の出力の可読性を向上させるために、トップレベル項目の各要約は1行を占有することが保証されています。

インターフェース定義内の特定のメソッドのドキュメントは、例えば “go doc net.Conn.SetDeadline” のようにリクエストできるようになりました。

プラグイン

Goは、Goで記述されたプラグインを生成するための “plugin” ビルドモードと、実行時にそのようなプラグインをロードするための新しい plugin パッケージで、プラグインの早期サポートを提供するようになりました。プラグインのサポートは現在、Linuxでのみ利用可能です。問題点があれば報告してください。

ランタイム

引数の生存期間

ガベージコレクターは、関数の実行全体を通して引数をライブとは見なさなくなりました。詳細、および変数をライブのままにする方法については、Go 1.7で追加された runtime.KeepAlive 関数を参照してください。

更新: 割り当てられたオブジェクトにファイナライザを設定するコードは、そのオブジェクトを使用する関数またはメソッド内で runtime.KeepAlive の呼び出しを追加する必要がある場合があります。詳細については、KeepAlive のドキュメントとその例を参照してください。

同時マップの誤用

Go 1.6では、ランタイムがマップの同時誤用の軽量で最善な検出を追加しました。このリリースでは、マップへの同時書き込みとマップ上でのイテレーションを行うプログラムを検出するサポートを追加して、検出器が改善されています。

常に言えることですが、1つのゴルーチンがマップに書き込みを行っている場合、他のゴルーチンはマップの読み取り(イテレーションを含む)または書き込みを同時に行うべきではありません。ランタイムがこの状態を検出すると、診断を出力してプログラムをクラッシュさせます。問題の詳細を知るための最良の方法は、レース検出器の下でプログラムを実行することです。これにより、レースをより確実に識別し、より詳細な情報が得られます。

MemStatsドキュメント

runtime.MemStats 型がより詳細に文書化されました。

パフォーマンス

常にそうであるように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な記述は困難です。ほとんどのプログラムは、ガベージコレクターの高速化と標準ライブラリの最適化により、少し高速に実行されるはずです。

bytescrypto/aescrypto/ciphercrypto/ellipticcrypto/sha256crypto/sha512encoding/asn1encoding/csvencoding/hexencoding/jsonhash/crc32image/colorimage/drawmathmath/bigreflectregexpruntimestrconvstringssyscalltext/template、および unicode/utf8 パッケージの実装が最適化されています。

ガベージコレクター

ガベージコレクションの一時停止は、Go 1.7よりも大幅に短縮され、通常は100マイクロ秒未満、多くの場合10マイクロ秒程度になります。詳細については、ストップザワールドスタックの再スキャンを排除するドキュメントを参照してください。Go 1.9では、さらに多くの作業が残っています。

遅延

遅延された関数呼び出しのオーバーヘッドが約半分に削減されました。

Cgo

GoからCへの呼び出しのオーバーヘッドが約半分に削減されました。

標準ライブラリ

多くのパッケージにドキュメントの例が追加されました。

ソート

sort パッケージには、less 関数を指定してスライスをソートするための便利な関数 Slice が含まれるようになりました。多くの場合、これは新しいソーター型を記述する必要がないことを意味します。

また、SliceStableSliceIsSorted も新しく追加されました。

HTTP/2プッシュ

net/http パッケージには、Handler から HTTP/2 サーバープッシュを送信するメカニズムが含まれるようになりました。既存の Flusher および Hijacker インターフェースと同様に、HTTP/2 ResponseWriter は、新しい Pusher インターフェースを実装するようになりました。

HTTPサーバーの正常なシャットダウン

HTTPサーバーは、新しい Server.Shutdown メソッドを使用した正常なシャットダウンと、新しい Server.Close メソッドを使用した突然のシャットダウンをサポートするようになりました。

より多くのコンテキストサポート

Go 1.7での採用に引き続き、context.Context が標準ライブラリに取り込まれ、Go 1.8では既存のパッケージにコンテキストサポートがさらに追加されています。

Mutex競合プロファイリング

ランタイムとツールは、競合するmutexのプロファイリングをサポートするようになりました。

ほとんどのユーザーは、新しい -mutexprofile フラグを “go test” で使用し、次に結果のファイルで pprof を使用することをお勧めします。

新しい MutexProfile および SetMutexProfileFraction を介して、より低レベルのサポートも利用できます。

Go 1.8の既知の制限は、プロファイルが sync.RWMutex ではなく sync.Mutex の競合のみを報告することです。

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

常にそうであるように、Go 1 互換性の約束を念頭に置いて、ライブラリにはさまざまなマイナーな変更と更新があります。次のセクションでは、ユーザーに見える変更と追加をリストします。最適化とマイナーなバグ修正はリストされていません。

archive/tar

tar実装は、ファイル形式のコーナーケースにおける多くのバグを修正します。Reader は、8GBを超えるエントリを持つPAX形式のtarファイルを処理できるようになりました。Writer は、長いパス名に関わる一部の状況で無効なtarファイルを生成しなくなりました。

compress/flate

特定の状況で圧縮率を向上させるために、エンコーダーにいくつかのマイナーな修正が行われました。その結果、DEFLATE の正確なエンコード出力は Go 1.7 と異なる場合があります。DEFLATE はgzip、png、zlib、およびzipの基礎となる圧縮であるため、これらの形式の出力が変更されている可能性があります。

エンコーダーは、NoCompression モードで動作している場合、Write メソッドに渡されるスライスのサイズに依存しない一貫した出力を生成するようになりました。

デコーダーは、エラーが発生した場合、エラーとともに圧縮されていないバッファリングされたデータを返すようになりました。

compress/gzip

Writer は、Header.ModTime フィールドがゼロ値の場合、ゼロの MTIME フィールドをエンコードするようになりました。Goの以前のリリースでは、Writer は無意味な値をエンコードしていました。同様に、Reader は、ゼロエンコードされた MTIME フィールドをゼロの Header.ModTime として報告するようになりました。

context

DeadlineExceeded エラーは、net.Error を実装し、Timeout メソッドと Temporary メソッドの両方で true を報告するようになりました。

crypto/tls

新しいメソッド Conn.CloseWrite を使用すると、TLS接続をハーフクローズできます。

新しいメソッド Config.Clone は、TLS構成を複製します。

新しい Config.GetConfigForClient コールバックを使用すると、クライアントの ClientHelloInfo に基づいて、クライアントの構成を動的に選択できます。ClientHelloInfo 構造体には、新しいフィールド ConnSignatureSchemes (新しい型 SignatureScheme を使用)、SupportedProtos、および SupportedVersions があります。

新しい Config.GetClientCertificate コールバックを使用すると、新しい CertificateRequestInfo で表されるサーバーのTLS CertificateRequest メッセージに基づいて、クライアント証明書を選択できます。

新しい Config.KeyLogWriter を使用すると、WireShark や類似のツールでTLS接続をデバッグできます。

新しい Config.VerifyPeerCertificate コールバックを使用すると、ピアが提示した証明書の追加検証が可能になります。

crypto/tls パッケージは、CBCパディングオラクルに対する基本的な対策を実装するようになりました。明示的な秘密依存のタイミングは存在しないはずですが、キャッシュタイミングリークを防ぐためのメモリアクセスの正規化は試みません。

crypto/tls パッケージは、X25519 およびChaCha20-Poly1305をサポートするようになりました。ChaCha20-Poly1305は、AES-GCMのハードウェアサポートが存在する場合を除き、優先されるようになりました。

SHA-256を使用したAES-128-CBC暗号スイートもサポートされるようになりましたが、デフォルトでは無効になっています。

crypto/x509

PSS署名がサポートされるようになりました。

UnknownAuthorityError には、信頼されていない証明書を報告する Cert フィールドが含まれるようになりました。

証明書の検証は、いくつかのケースではより寛容になり、他のいくつかのケースではより厳格になります。

ルート証明書は、RHELとCentOSをサポートするために、Linuxの /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem でも検索されるようになりました。

database/sql

このパッケージは context.Context をサポートするようになりました。コンテキスト引数を取る、DB.QueryContextDB.PrepareContext のように、Context で終わる新しいメソッドがあります。新しい Context メソッドを使用すると、リクエストが完了したときに接続が閉じられて接続プールに戻されることが保証されます。ドライバーがサポートしている場合は、進行中のクエリのキャンセルが可能になります。また、データベースプールは次の利用可能な接続を待機するのをキャンセルできます。

IsolationLevel は、トランザクションの開始時に TxOptions.Isolation に分離レベルを設定し、それを DB.BeginTx に渡すことで設定できます。ドライバーがサポートしていない分離レベルを選択すると、エラーが返されます。トランザクションで読み取り専用属性を設定するには、TxOptions.ReadOnly を true に設定します。

クエリは、それをサポートするドライバーのSQL列型情報を公開するようになりました。Rowsは、SQL型情報、列型長、およびGo型を含む ColumnTypes を返すことができます。

Rows は複数の結果セットを表せるようになりました。Rows.Next が false を返した後、Rows.NextResultSet を呼び出して次の結果セットに進むことができます。既存の Rows は、次の結果セットに進んだ後も引き続き使用する必要があります。

NamedArg をクエリ引数として使用できます。新しい関数 Named は、NamedArg をより簡潔に作成するのに役立ちます。

ドライバーが新しい Pinger インターフェースをサポートしている場合、DB.Ping および DB.PingContext メソッドは、そのインターフェースを使用してデータベース接続がまだ有効かどうかを確認します。

新しい Context クエリメソッドはすべてのドライバーで機能しますが、ドライバーがそれらを使用するように更新されていない限り、Context のキャンセルは応答しません。その他の機能は、database/sql/driver でのドライバーのサポートが必要です。ドライバーの作成者は、新しいインターフェースを確認する必要があります。既存のドライバーのユーザーは、ドライバーのドキュメントを確認して、ドライバーがサポートするものと、各機能に関するシステム固有のドキュメントを確認する必要があります。

debug/pe

パッケージが拡張され、Goリンカーgcc 生成のオブジェクトファイルを読み込むために使用されるようになりました。新しい File.StringTable および Section.Relocs フィールドは、COFF文字列テーブルとCOFF再配置へのアクセスを提供します。新しい File.COFFSymbols は、COFFシンボルテーブルへの低レベルアクセスを可能にします。

encoding/base64

新しい Encoding.Strict メソッドは、末尾のパディングビットがゼロでない場合にデコーダーがエラーを返す Encoding を返します。

encoding/binary

Read および Write がブール値をサポートするようになりました。

encoding/json

UnmarshalTypeError に、構造体とフィールド名が含まれるようになりました。

nil の Marshaler は、JSON の null 値としてマーシャリングされるようになりました。

RawMessage の値は、ポインター型と同じようにマーシャリングされるようになりました。

Marshal は、ES6 と同じ形式を使用して浮動小数点数をエンコードし、より広い範囲の値に対して(指数表記ではなく)10進表記を優先します。特に、最大 264 までのすべての浮動小数点整数は、同等の int64 表現と同じようにフォーマットされます。

以前のバージョンの Go では、JSON の nullUnmarshaler にアンマーシャリングすることはノーオペレーションと見なされていましたが、現在は UnmarshalerUnmarshalJSON メソッドが JSON リテラル null で呼び出され、その場合のセマンティクスを定義できます。

encoding/pem

Decode は、終了行の形式に関して厳密になりました。

encoding/xml

Unmarshal は、新しい ",any,attr" 構造体タグを使用して、すべてのアトリビュートを収集するためのワイルドカードサポートを備えました。

expvar

新しいメソッド Int.ValueString.ValueFloat.Value、および Func.Value は、エクスポートされた変数の現在の値を報告します。

新しい関数 Handler は、パッケージの HTTP ハンドラーを返し、標準以外の場所にインストールできるようにします。

fmt

ScanfFscanf、および Sscanf が、以前のリリースよりもスペースを異なる方法で、より一貫して処理するようになりました。詳細については、スキャニングのドキュメントを参照してください。

go/doc

新しい IsPredeclared 関数は、文字列が事前宣言された識別子であるかどうかを報告します。

go/types

新しい関数 Default は、「型なし」型のデフォルトの「型付き」型を返します。

complex64 のアラインメントが Go コンパイラー と一致するようになりました。

html/template

パッケージは、<script> タグの "type" アトリビュートを検証するようになりました。

image/png

Decode (および DecodeConfig)が、True Color およびグレースケール透過をサポートするようになりました。

Encoder が高速になり、パレット化された画像をエンコードするときに、より小さい出力が作成されるようになりました。

math/big

新しいメソッド Int.Sqrt は ⌊√x⌋ を計算します。

新しいメソッド Float.Scan は、fmt.Scanner のサポートルーチンです。

Int.ModInverse は負の数をサポートするようになりました。

math/rand

新しい Rand.Uint64 メソッドは uint64 値を返します。新しい Source64 インターフェースは、このような値を直接生成できるソースを記述します。それ以外の場合、Rand.Uint64 メソッドは SourceInt63 メソッドへの 2 回の呼び出しから uint64 を構築します。

mime

ParseMediaType は、MSIE をサポートするために、不要なバックスラッシュエスケープをリテラルとして保持するようになりました。MSIE が(「イントラネットモード」で)完全なファイルパスを送信する場合、バックスラッシュをエスケープしません。つまり、"C:\dev\go\foo.txt" であり、"C:\\dev\\go\\foo.txt" ではありません。不要なバックスラッシュエスケープが見つかった場合、MSIE からのものであり、リテラルのバックスラッシュとして意図されていると見なします。既知の MIME ジェネレーターは、数字や文字などの単純なトークン文字に不要なバックスラッシュエスケープを発行しません。

mime/quotedprintable

Reader の解析は、実際に見られるより多くの入力を受け入れるために、2 つの方法で緩和されました。まず、2 つの 16 進数で後続されていない等号(=)をリテラル等号として受け入れます。次に、エンコードされた入力の末尾にある末尾の等号をサイレントに無視します。

net

Conn のドキュメントが更新され、インターフェースの実装に関する期待が明確になりました。net/http パッケージの更新は、ドキュメントを遵守する実装に依存します。

更新: Conn インターフェースの実装は、文書化されたセマンティクスを実装していることを検証する必要があります。golang.org/x/net/nettest パッケージは Conn を実行し、それが適切に動作することを検証します。

新しいメソッド UnixListener.SetUnlinkOnClose は、リスナーが閉じられたときに、基になるソケットファイルをファイルシステムから削除する必要があるかどうかを設定します。

新しい Buffers 型を使用すると、メモリ内の複数の不連続なバッファーからネットワークへの書き込みをより効率的に行うことができます。特定のタイプの一部のマシンでは、特定のタイプの接続の場合、これは OS 固有のバッチ書き込み操作(writev など)に最適化されます。

新しい Resolver は、名前と番号を検索し、context.Context をサポートします。Dialer に、オプションの Resolver フィールドが追加されました。

Interfaces が Solaris でサポートされるようになりました。

Go DNS リゾルバーは、resolv.conf の "rotate" および "option ndots:0" オプションをサポートするようになりました。"ndots" オプションは、libresolve と同じ方法で尊重されるようになりました。

net/http

サーバーの変更

サーバーの Handler が実行できることには、いくつかの追加があります。

クライアントとトランスポートの変更

net/http/httptrace

新しい ClientTrace.TLSHandshakeStart および ClientTrace.TLSHandshakeDone を使用して、クライアントリクエストの TLS ハンドシェイクを追跡するためのサポートが追加されました。

net/http/httputil

ReverseProxy には、バックエンドからの応答をクライアントにプロキシする前に変更するための新しいオプションのフックである、ModifyResponse があります。

net/mail

アドレスの名前部分で空の引用符付き文字列が再び許可されるようになりました。つまり、Go 1.4 以前では "" <gopher@example.com> が受け入れられていましたが、Go 1.5 ではこのアドレスを拒否するバグが導入されました。アドレスが再び認識されるようになりました。

これまで、Header.Dateメソッドは、Date:ヘッダーを解析する方法を提供していました。新しい関数ParseDateを使用すると、Resent-Date:ヘッダーなど、他のヘッダー行にある日付を解析できます。

net/smtp

Auth.Startメソッドの実装が空のtoServer値を返す場合、パッケージは、一部のサーバーで拒否されていたSMTP AUTHコマンドで末尾の空白を送信しなくなります。

net/url

新しい関数PathEscapePathUnescapeは、クエリのエスケープとエスケープ解除関数に似ていますが、パス要素用です。

新しいメソッドURL.HostnameURL.Portは、URLのホスト名とポートフィールドを返し、ポートが存在しない場合も正しく処理します。

既存のメソッドURL.ResolveReferenceは、エスケープされたバイトを含むパスを、エスケープを失うことなく正しく処理するようになりました。

URL型は、encoding.BinaryMarshalerencoding.BinaryUnmarshalerを実装するようになり、gobデータでURLを処理することが可能になりました。

RFC 3986に従い、Parseは、this_that:other/thingのようなURLを、相対パスとして解釈する代わりに(this_thatは有効なスキームではありません)、拒否するようになりました。相対パスとして強制的に解釈するには、このようなURLに「./」をプレフィックスとして付ける必要があります。URL.Stringメソッドは、必要に応じてこのプレフィックスを挿入するようになりました。

os

新しい関数Executableは、実行中の実行可能ファイルのパス名を返します。

すでに閉じられたos.Fileに対してメソッドを呼び出そうとすると、新しいエラー値os.ErrClosedが返されるようになりました。以前は、syscall.EBADFなどのシステム固有のエラーが返されていました。

Unixシステムでは、os.Renameは、ディレクトリを既存の空のディレクトリにリネームするために使用した場合にエラーを返すようになりました。以前は、空でないディレクトリにリネームするときは失敗していましたが、空のディレクトリにリネームするときは成功していました。これにより、Unixでの動作が他のシステムの動作に対応するようになりました。

Windowsでは、長い絶対パスは、拡張長パス(「\\?\」で始まるパス)に透過的に変換されるようになりました。これにより、パッケージは、パス名が260文字を超えるファイルで作業できます。

Windowsでは、os.IsExistは、システムエラーERROR_DIR_NOT_EMPTYに対してtrueを返すようになりました。これは、UnixエラーENOTEMPTYの既存の処理にほぼ対応しています。

Plan 9では、#Mで提供されないファイルには、FileInfo.Modeによって返される値でModeDeviceが設定されるようになりました。

path/filepath

Windowsで、いくつかのバグとコーナーケースが修正されました。Absは、ドキュメントのとおりにCleanを呼び出すようになりました。Globは、「\\?\c:\*」と一致するようになりました。EvalSymlinksは、「C:.」を正しく処理するようになりました。そして、Cleanは、パスの先頭の「..」を正しく処理するようになりました。

reflect

新しい関数Swapperが、sort.Sliceをサポートするために追加されました。

strconv

Unquote関数は、Go言語のセマンティクスに従い、バッククォートされたraw文字列内のキャリッジリターン(\r)を削除するようになりました。

syscall

Getpagesizeは、定数値ではなくシステムのサイズを返すようになりました。以前は常に4KBを返していました。

Utimesのシグネチャは、他のすべてのUnixシステムのシグネチャに一致するようにSolarisで変更されました。移植性のあるコードでは、引き続きos.Chtimesを使用する必要があります。

X__cmsg_dataフィールドがCmsghdrから削除されました。

text/template

Template.Executeは、データ引数としてreflect.Valueを受け取ることができるようになり、FuncMap関数もreflect.Valueを受け取って返すことができるようになりました。

time

新しい関数Untilは、類似のSince関数を補完します。

ParseDurationは、長い小数部を受け入れるようになりました。

Parseは、6月0日のように、月の開始日より前の日付を拒否するようになりました。すでに、6月31日や7月32日のように、月の末日を超える日付は拒否していました。

ローカルタイムゾーンデータベースをまだ持っていないシステムのために、tzdataデータベースがバージョン2016jに更新されました。

testing

新しいメソッドT.Name(およびB.Name)は、現在のテストまたはベンチマークの名前を返します。

新しい関数CoverModeは、テストカバレッジモードを報告します。

レースディテクターが有効になっていて、実行中にデータレースが発生した場合、テストとベンチマークは失敗としてマークされるようになりました。以前は、個々のテストケースはパスするように見え、テストバイナリの全体的な実行のみが失敗していました。

ドキュメントで許可されているように、MainStart関数のシグネチャが変更されました。これは内部的な詳細であり、Go 1の互換性の約束の一部ではありません。MainStartを直接呼び出していなくてもエラーが発生する場合は、通常は空であるGOROOT環境変数を設定していて、それがgoコマンドのバイナリのバージョンと一致しない可能性が高いことを意味します。

unicode

提供された入力が無効なruneであった場合、SimpleFoldは引数を変更せずに返すようになりました。以前は、実装はインデックス境界チェックパニックで失敗していました。