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 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
ツールには、インポートを「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
を呼び出し、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バージョンが含まれる見込みです。
デフォルトの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では、さらに多くの作業が残っています。
遅延
遅延された関数呼び出しのオーバーヘッドが約半分に削減されました。
Cgo
GoからCへの呼び出しのオーバーヘッドが約半分に削減されました。
標準ライブラリ
例
多くのパッケージにドキュメントの例が追加されました。
ソート
sort パッケージには、less 関数を指定してスライスをソートするための便利な関数 Slice
が含まれるようになりました。多くの場合、これは新しいソーター型を記述する必要がないことを意味します。
また、SliceStable
と SliceIsSorted
も新しく追加されました。
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では既存のパッケージにコンテキストサポートがさらに追加されています。
- 新しい
Server.Shutdown
はコンテキスト引数を取ります。 - 重要な追加が、コンテキストサポートとともに database/sql パッケージに行われました。
- 新しい
net.Resolver
の新しい9つのLookup
メソッドはすべて、コンテキストを取るようになりました。
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
構造体には、新しいフィールド Conn
、SignatureSchemes
(新しい型 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.QueryContext
や DB.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 の 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
パッケージは、<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
メソッドは 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
型を使用すると、メモリ内の複数の不連続なバッファーからネットワークへの書き込みをより効率的に行うことができます。特定のタイプの一部のマシンでは、特定のタイプの接続の場合、これは OS 固有のバッチ書き込み操作(writev
など)に最適化されます。
新しい 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
は、RFC 7232、セクション 2.3 に従って適切にフォーマットされた ETag の以前のIf-None-Match
サポートに加えて、HTTPIf-Match
条件付きリクエストをサポートするようになりました。
サーバーの Handler
が実行できることには、いくつかの追加があります。
-
Request.Context
によって返されるContext
は、基になるnet.Conn
が閉じられた場合にキャンセルされます。たとえば、ユーザーが遅いリクエストの途中でブラウザーを閉じた場合、Handler
はユーザーがいなくなったことを検出できるようになりました。これは、既存のCloseNotifier
サポートを補完するものです。この機能には、基になるnet.Conn
が最近明確化されたインターフェースドキュメントを実装している必要があります。 -
ヘッダーがすでに書き込まれた後に生成されたトレーラーを提供するには、新しい
TrailerPrefix
メカニズムを参照してください。 -
Handler
は、エラーErrAbortHandler
でパニックを起こすことによって、応答を中止できるようになりました。 -
ResponseWriter
へのゼロバイトのWrite
は、ResponseWriter
がハイジャックされたかどうかをテストする方法として定義されるようになりました。ハイジャックされている場合、Write
はサーバーのエラーログにエラーを出力せずにErrHijacked
を返します。
クライアントとトランスポートの変更
-
Client
は、リダイレクト時にほとんどのリクエストヘッダーをコピーするようになりました。詳細については、Client
型に関するドキュメントを参照してください。 -
Transport
は、国際ドメイン名をサポートするようになりました。その結果、Get およびその他のヘルパーも同様にサポートします。 -
Client
は、301、307、および 308 のリダイレクトをサポートするようになりました。たとえば、Client.Post
は、以前に 302 および 303 リダイレクトレスポンスに対して行ったように、301 リダイレクトに従うようになり、それらを本体のないGET
リクエストに変換します。Client
は、307 および 308 リダイレクトにも従うようになり、元のリクエストメソッドと本文(存在する場合)を保持します。リダイレクトでリクエスト本文を再送信する必要がある場合、リクエストには新しいRequest.GetBody
フィールドが定義されている必要があります。NewRequest
は、一般的な本体型に対してRequest.GetBody
を自動的に設定します。 -
Transport
は、数字以外の文字を含むポートの URL のリクエストを拒否するようになりました。 -
Transport
は、ネットワーク障害が発生する前にバイトが書き込まれず、リクエストに本文がない場合、非べき等リクエストを再試行するようになりました。 -
新しい
Transport.ProxyConnectHeader
を使用すると、CONNECT
リクエスト中にプロキシに送信するヘッダー値を構成できます。 -
DefaultTransport.Dialer
は、IPv6 が失敗する可能性がある場合、IPv4 をバックアップとして使用できるようにする、DualStack
("Happy Eyeballs")サポートを有効にするようになりました。 -
Transport
は、Request.ContentLength
がゼロの場合、Request.Body
が非 nil のときに、ContentLength
が実際にゼロなのか、それとも定義されていないだけなのかを判断するために、1 バイトを読み込まなくなりました。本体の長さがゼロであることを明示的に通知するには、nil
に設定するか、新しい値NoBody
に設定します。新しいNoBody
値は、Request
コンストラクター関数で使用することを目的としています。これは、NewRequest
によって使用されます。
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
新しい関数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言語のセマンティクスに従い、バッククォートされた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
は引数を変更せずに返すようになりました。以前は、実装はインデックス境界チェックパニックで失敗していました。