前書き
Go 1.8 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.8 Release Notes
次のバージョン:Go1.9のリリースノート(日本語訳)
前のバージョン:Go1.7のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.8の紹介
最新のGoリリースであるバージョン1.8は、Go 1.7 から6ヶ月後に登場しました。変更のほとんどはツールチェーン、ランタイム、ライブラリの実装にあります。言語仕様には2つの小さな変更 があります。リリースは常にGo 1の互換性の約束 を維持しています。ほとんどのGoプログラムはこれまで通りにコンパイルおよび実行されることを期待しています。
このリリースでは、32ビットMIPSのサポートを追加 し、コンパイラのバックエンドを更新 してより効率的なコードを生成し、GCの停止時間を短縮 するためにストップ・ザ・ワールドのスタック再スキャンを排除し、HTTP/2 Pushのサポートを追加 し、HTTPの優雅なシャットダウンを追加 し、より多くのコンテキストサポートを追加 し、ミューテックスのプロファイリングを可能にし 、スライスのソートを簡素化 しました。
言語の変更
1.8から、ある構造体型から別の構造体型に明示的に値を変換する際、タグは無視されます。したがって、タグのみが異なる2つの構造体は相互に変換可能です。
|
|
言語仕様では、浮動小数点定数の16ビット指数までのサポートが必要とされるようになりました。これは「gc 」またはgccgoコンパイラには影響しません。どちらも32ビット指数をサポートしています。
ポート
Goは、FPUまたはカーネルFPUエミュレーションを実装するビッグエンディアン(linux/mips)およびリトルエンディアン(linux/mipsle)の32ビットMIPSをLinuxでサポートするようになりました。多くの一般的な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 15658 およびissue 16511 を参照してください。これらの問題の解決に役立つ情報をお待ちしています。
ツール
アセンブラ
64ビットx86システム向けに、次の命令が追加されました:VBROADCASTSD
、BROADCASTSS
、MOVDDUP
、MOVSHDUP
、MOVSLDUP
、VMOVDDUP
、VMOVSHDUP
、VMOVSLDUP
。64ビットPPCシステム向けに、一般的なベクタースカラー命令が追加されました:LXS
、LXSDX
、LXSI
、LXSIWAX
、LXSIWZX
、LXV
、LXVD2X
、LXVDSX
、LXVW4X
、MFVSR
、MFVSRD
、MFVSRWZ
、MTVSR
、MTVSRD
、MTVSRWA
、MTVSRWZ
、STXS
、STXSDX
、STXSI
、STXSIWX
、STXV
、STXVD2X
、STXVW4X
、XSCV
、XSCVDPSP
、XSCVDPSPN
、XSCVDPSXDS
、XSCVDPSXWS
、XSCVDPUXDS
、XSCVDPUXWS
、XSCVSPDP
、XSCVSPDPN
、XSCVSXDDP
、XSCVSXDSP
、XSCVUXDDP
、XSCVUXDSP
、XSCVX
、XSCVXP
、XVCV
、XVCVDPSP
、XVCVDPSXDS
、XVCVDPSXWS
、XVCVDPUXDS
、XVCVDPUXWS
、XVCVSPDP
、XVCVSPSXDS
、XVCVSPSXWS
、XVCVSPUXDS
、XVCVSPUXWS
、XVCVSXDDP
、XVCVSXDSP
、XVCVSXWDP
、XVCVSXWSP
、XVCVUXDDP
、XVCVUXDSP
、XVCVUXWDP
、XVCVUXWSP
、XVCVX
、XVCVXP
、XXLAND
、XXLANDC
、XXLANDQ
、XXLEQV
、XXLNAND
、XXLNOR
、XXLOR
、XXLORC
、XXLORQ
、XXLXOR
、XXMRG
、XXMRGHW
、XXMRGLW
、XXPERM
、XXPERMDI
、XXSEL
、XXSI
、XXSLDWI
、XXSPLT
、XXSPLTW
。
Yacc
yacc
ツール(以前は「go tool yacc
」で利用可能)は削除されました。Go 1.7以降、Goコンパイラでは使用されなくなりました。「tools」リポジトリに移動し、現在はgolang.org/x/tools/cmd/goyacc
で利用可能です。
Fix
fix
ツールには新しい「context
」修正があり、インポートを「golang.org/x/net/context
」から「context
」に変更します。
Pprof
pprof
ツールは、TLS
サーバーをプロファイルし、「https+insecure
」URLスキームを使用して証明書検証をスキップできるようになりました。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%削減します。64ビットx86システムでは、すでにGo 1.7でSSA
バックエンドを使用していたため、改善はより控えめな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
環境変数の値を記憶し、デフォルトで将来のすべてのコンパイルに適用します。これは、issue #12808
を修正するためです。ネイティブコンパイルを行う場合、CGO_ENABLED
環境変数を明示的に設定する必要はほとんどありません。make.bash
は自動的に正しい設定を検出します。環境がcgo
をサポートしているが、明示的にcgo
サポートを望まない場合にCGO_ENABLED
環境変数を設定する主な理由があります。その場合、make.bash
またはall.bash
中にCGO_ENABLED=0
を設定します。環境変数PKG_CONFIG
を使用して、#cgo pkg-config
ディレクティブを処理するプログラムを設定できます。デフォルトはpkg-config
で、以前のリリースで常に使用されていたプログラムです。これは、cgo
コードをクロスコンパイルしやすくすることを目的としています。cgo
ツールは、go
コマンドで使用される-srcdir
オプションをサポートするようになりました。cgo
コードがC.malloc
を呼び出し、malloc
がNULL
を返す場合、プログラムはメモリ不足エラーでクラッシュします。C.malloc
はnil
を返すことはありません。ほとんどの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バージョンが含まれると予想しています。
Default 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 型は、より詳細にドキュメント化されました。
パフォーマンス
常に、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を行うことは困難です。ほとんどのプログラムは、ガベージコレクタの速度向上と標準ライブラリの最適化により、少し速く実行されるはずです。次のパッケージの実装に最適化が行われました:bytes 、crypto/aes 、crypto/cipher 、crypto/elliptic 、crypto/sha256 、crypto/sha512 、encoding/asn1 、encoding/csv 、encoding/hex 、encoding/json 、hash/crc32 、image/color 、image/draw 、math 、math/big 、reflect 、regexp 、runtime 、strconv 、strings 、syscall 、text/template 、unicode/utf8 。
ガベージコレクタ
ガベージコレクションの停止時間は、Go 1.7よりも大幅に短くなるはずで、通常は100マイクロ秒未満であり、しばしば10マイクロ秒程度です。詳細については、ストップ・ザ・ワールドスタック再スキャンの排除に関するドキュメント を参照してください。Go 1.9に向けてさらに作業が残っています。
Defer
遅延関数呼び出し のオーバーヘッドは約半分に削減されました。
Cgo
GoからCへの呼び出しのオーバーヘッドは約半分に削減されました。
標準ライブラリ
Examples
多くのパッケージのドキュメントに例が追加されました。
Sort
sort
パッケージには、less
関数を指定してスライスをソートするための便利な関数Slice
が追加されました。多くの場合、新しいソータ型を書く必要がなくなります。また、新しいSliceStable
とSliceIsSorted
も追加されました。
HTTP/2 Push
net/http
パッケージには、Handler
からHTTP/2サーバープッシュを送信するためのメカニズムが追加されました。既存のFlusher
およびHijacker
インターフェースに似て、HTTP/2のResponseWriter
は新しいPusher
インターフェースを実装しています。
HTTP Server Graceful Shutdown
HTTPサーバーは、新しいServer.Shutdown メソッドを使用した優雅なシャットダウンと、新しいServer.Close メソッドを使用した突然のシャットダウンをサポートするようになりました。
より多くのコンテキストサポート
Go 1.7の採用 に続いて、Go 1.8は標準ライブラリにcontext.Context のサポートをさらに追加しました。
新しいServer.Shutdown
は、コンテキスト引数を取ります。database/sql
パッケージには、コンテキストサポートを伴う大幅な追加
があります。新しいnet.Resolver
の9つの新しいLookup
メソッドはすべて、コンテキストを取ります。
ミューテックス競合プロファイリング
ランタイムとツールは、競合するミューテックスのプロファイリングをサポートするようになりました。ほとんどのユーザーは、新しい-mutexprofile
フラグを使用して「go test
」を実行し、その結果ファイルに対してpprof
を使用することを望むでしょう。低レベルのサポートは、新しいMutexProfile
およびSetMutexProfileFraction
を介しても利用可能です。Go 1.8の既知の制限は、プロファイルがsync.Mutex
の競合のみを報告し、sync.RWMutex
の競合を報告しないことです。
ライブラリの小さな変更
常に、ライブラリには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
構造体には、新しいフィールドConn
、SignatureSchemes
(新しい型SignatureScheme
を使用)、SupportedProtos
、およびSupportedVersions
があります。新しいConfig.GetClientCertificate
コールバックは、サーバーのTLS CertificateRequestメッセージに基づいてクライアント証明書を選択することを可能にします。これは、新しいCertificateRequestInfo
で表されます。新しいConfig.KeyLogWriter
は、WireShark
や類似のツールでTLS接続をデバッグすることを可能にします。新しいConfig.VerifyPeerCertificate
コールバックは、ピアの提示された証明書の追加の検証を可能にします。crypto/tls
パッケージは、CBCパディングオラクルに対する基本的な対策を実装しています。明示的な秘密依存のタイミングはありませんが、キャッシュタイミングリークを防ぐためにメモリアクセスを正規化しようとはしていません。crypto/tls
パッケージは、X25519
およびChaCha20-Poly1305
をサポートするようになりました。ChaCha20-Poly1305
は、AES-GCMのハードウェアサポートがない限り、優先されます。AES-128-CBC暗号スイートはSHA-256でサポートされるようになりましたが、デフォルトでは無効です。
crypto/x509
PSS署名がサポートされるようになりました。UnknownAuthorityError
には、信頼されていない証明書を報告するCert
フィールドがあります。証明書の検証は、いくつかのケースでより寛容になり、他のいくつかのケースでより厳格になりました。ルート証明書は、Linuxの/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
でも探されるようになり、RHELおよびCentOSをサポートします。
database/sql
パッケージはcontext.Context
をサポートするようになりました。Context
で終わる新しいメソッドがあり、たとえばDB.QueryContext
やDB.PrepareContext
などがコンテキスト引数を取ります。新しいContext
メソッドを使用することで、リクエストが完了したときに接続が閉じられ、接続プールに戻されることが保証されます。ドライバがそれをサポートしている場合、進行中のクエリをキャンセルすることが可能になります。また、データベースプールが次の利用可能な接続を待つことをキャンセルすることができます。IsolationLevel
は、TxOptions.Isolation
に分離レベルを設定し、DB.BeginTx
に渡すことで、トランザクションを開始するときに設定できるようになりました。ドライバがサポートしていない分離レベルが選択された場合、エラーが返されます。トランザクションに読み取り専用属性を設定することもでき、TxOptions.ReadOnly
をtrue
に設定します。クエリは、ドライバがそれをサポートしている場合、SQL列タイプ情報を公開します。行は、SQLタイプ情報、列タイプの長さ、およびGoタイプを含むことができるColumnTypes
を返すことができます。Rows
は、複数の結果セットを表すことができるようになりました。Rows.Next
がfalse
を返した後、Rows.NextResultSet
を呼び出して次の結果セットに進むことができます。既存の行は、次の結果セットに進んだ後も使用し続ける必要があります。NamedArg
は、クエリ引数として使用できます。新しい関数Named
は、NamedArg
をより簡潔に作成するのに役立ちます。ドライバが新しいPinger
インターフェースをサポートしている場合、DB.Ping
およびDB.PingContext
メソッドは、そのインターフェースを使用してデータベース接続がまだ有効かどうかを確認します。新しいコンテキストクエリメソッドはすべてのドライバで機能しますが、ドライバがそれらを使用するように更新されていない限り、コンテキストキャンセルは応答しません。他の機能は、database/sql/driver
でのドライバサポートを必要とします。ドライバの作成者は、新しいインターフェースを確認する必要があります。既存のドライバのユーザーは、ドライバのドキュメントを確認して、サポートしているものと各機能に関するシステム固有のドキュメントを確認する必要があります。
debug/pe
パッケージは拡張され、Goリンカ
がgcc
生成のオブジェクトファイルを読み取るために使用されるようになりました。新しいFile.StringTable
およびSection.Relocs
フィールドは、COFF
文字列テーブルおよびCOFF
再配置へのアクセスを提供します。新しいFile.COFFSymbols
は、COFF
シンボルテーブルへの低レベルアクセスを可能にします。
encoding/base64
新しいEncoding.Strict メソッドは、デコーダが末尾のパディングビットがゼロでない場合にエラーを返すエンコーディングを返します。
encoding/binary
Read およびWrite は、ブール値をサポートするようになりました。
encoding/json
UnmarshalTypeError
は、構造体とフィールド名を含むようになりました。nil
のMarshaler
は、JSONのnull
値としてマーシャルされるようになりました。RawMessage
値は、そのポインタ型と同じようにマーシャルされます。Marshal
は、浮動小数点数をES6
と同じ形式でエンコードし、より広い範囲の値に対して10進(指数ではなく)表記を優先します。特に、264までのすべての浮動小数点整数は、同等のint64
表現と同じ形式になります。以前のバージョンのGoでは、JSONのnull
をUnmarshaler
にアンマーシャルすることは無操作と見なされていました。現在、UnmarshalerのUnmarshalJSON
メソッドは、JSONリテラルnull
で呼び出され、そのケースのセマンティクスを定義できます。
encoding/pem
Decode は、終了行の形式に厳密になりました。
encoding/xml
Unmarshal
は、新しい「,any,attr
」構造体タグを使用してすべての属性を収集するワイルドカードサポートを持つようになりました。
expvar
新しいメソッドInt.Value 、String.Value 、Float.Value 、およびFunc.Value は、エクスポートされた変数の現在の値を報告します。新しい関数Handler は、パッケージのHTTPハンドラを返し、非標準の場所にインストールできるようにします。
fmt
Scanf 、Fscanf 、およびSscanf は、以前のリリースよりもスペースを異なり、より一貫して処理します。詳細については、スキャンのドキュメント を参照してください。
go/doc
新しいIsPredeclared 関数は、文字列が事前に宣言された識別子であるかどうかを報告します。
go/types
新しい関数Default
は、「型なし」型のデフォルトの「型付き」型を返します。complex64
のアライメントは、Goコンパイラ
と一致するようになりました。
html/template
パッケージは、<code>
タグの「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
メソッドは、Source
のInt63
メソッドへの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
型は、メモリ内の複数の非連続バッファからネットワークへの書き込みをより効率的に行うことを可能にします。特定のマシンでは、特定のタイプの接続に対して、これはwritev
のようなOS固有のバッチ書き込み操作に最適化されます。新しいResolver
は、名前と番号を検索し、context.Context
をサポートします。Dialer
には、オプションのResolverフィールド
があります。Interfaces
は、Solarisでサポートされるようになりました。Go DNSリゾルバは、resolv.conf
の「rotate
」および「option ndots:0
」オプションをサポートするようになりました。「ndots
」オプションは、libresolve
と同じ方法で尊重されるようになりました。
net/http
サーバーの変更点:
- サーバーは、上記で言及された優雅なシャットダウンサポートをサポートするようになりました。
- Server
は、構成オプション
ReadHeaderTimeout
およびIdleTimeout
を追加し、WriteTimeout
を文書化します。 - FileServer
およびServeContent
は、以前の
If-None-Match
サポートに加えて、HTTPIf-Match
条件付きリクエストをサポートするようになりました。ETagsはRFC 7232、セクション2.3に従って適切にフォーマットされています。
サーバーのHandler
ができることにいくつかの追加があります:
- Request.Context
によって返されるContext
は、基盤となる
net.Conn
が閉じられた場合にキャンセルされます。たとえば、ユーザーが遅いリクエストの途中でブラウザを閉じた場合、Handler
はユーザーがいなくなったことを検出できます。これは、既存のCloseNotifier サポートを補完します。この機能は、基盤となるnet.Conn が最近明確化されたインターフェースドキュメントを実装していることを必要とします。 - ヘッダーがすでに書き込まれた後に生成されたトレーラーを提供するには、新しいTrailerPrefix メカニズムを参照してください。
Handler
は、エラーErrAbortHandler でパニックを起こすことでレスポンスを中止できるようになりました。- ゼロバイトのWrite
は、
ResponseWriter
がハイジャックされたかどうかをテストする方法として定義されるようになりました:その場合、Write
はサーバーのエラーログにエラーを出力せずにErrHijacked を返します。
クライアントとトランスポートの変更点:
- Client は、リダイレクト時にほとんどのリクエストヘッダーをコピーするようになりました。詳細については、Clientのドキュメント を参照してください。
- Transport は、国際ドメイン名をサポートするようになりました。したがって、Get や他のヘルパーもサポートします。
Client
は、301、307、および308リダイレクトをサポートするようになりました。たとえば、Client.Post
は、以前に302および303リダイレクトレスポンスに対して行ったように、ボディなしでGET
リクエストに変換して301リダイレクトをフォローします。Client
は、307および308リダイレクトもフォローし、元のリクエストメソッドとボディを保持します。リダイレクトがリクエストボディの再送信を必要とする場合、リクエストには新しいRequest.GetBody フィールドが定義されている必要があります。NewRequest は、一般的なボディタイプに対してRequest.GetBody
を自動的に設定します。Transport
は、非数字文字を含むポートを持つURLのリクエストを拒否するようになりました。Transport
は、ネットワーク障害の前にバイトが書き込まれず、リクエストにボディがない場合、非冪等リクエストを再試行するようになりました。- 新しいTransport.ProxyConnectHeader
は、
CONNECT
リクエスト中にプロキシに送信するヘッダー値の設定を可能にします。 - DefaultTransport.Dialer は、「Happy Eyeballs 」サポートを有効にし、IPv6が失敗しているように見える場合にIPv4をバックアップとして使用できるようにします。
Transport
は、Request.ContentLength
がゼロであるか未定義であるかを判断するために、Request.Body
がnil
でない場合にバイトを読み取らなくなりました。ボディがゼロ長であることを明示的に示すには、それをnil
に設定するか、新しい値NoBody に設定します。新しいNoBody
値は、Request
コンストラクタ関数での使用を意図しており、NewRequest で使用されます。
net/http/httptrace
クライアントリクエストのTLSハンドシェイクをトレースするための新しいClientTrace.TLSHandshakeStart およびClientTrace.TLSHandshakeDone がサポートされるようになりました。
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
新しい関数PathEscape
およびPathUnescape
は、クエリのエスケープおよびアンエスケープ関数に似ていますが、パス要素用です。新しいメソッドURL.Hostname
およびURL.Port
は、URLのホスト名とポートフィールドを返し、ポートが存在しない場合を正しく処理します。既存のメソッドURL.ResolveReference
は、エスケープされたバイトを持つパスを適切に処理し、エスケープを失うことなく処理します。URL
型は、encoding.BinaryMarshaler
およびencoding.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言語のセマンティクスに従って、バッククォートされた生の文字列のキャリッジリターン(\r
)を削除するようになりました。
syscall
Getpagesize
は、システムのサイズを返すようになり、定数値ではなくなりました。以前は常に4KBを返していました。Utimes
のシグネチャは、Solarisで他のすべてのUnixシステムのシグネチャと一致するように変更されました。移植性のあるコードは、引き続きos.Chtimes
を使用する必要があります。Cmsghdr
からX__cmsg_data
フィールドが削除されました。
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
SimpleFold は、提供された入力が無効なルーンであった場合、その引数を変更せずに返すようになりました。以前の実装では、インデックス境界チェックのパニックで失敗していました。