前書き
Go 1.6 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.6 Release Notes
次のバージョン:Go1.7のリリースノート(日本語訳)
前のバージョン:Go1.5のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.6の紹介
最新のGoリリースであるバージョン1.6は、1.5の6か月後に登場しました。変更のほとんどは、言語、ランタイム、およびライブラリの実装にあります。言語仕様には変更はありません。リリースは常にGo 1の互換性の約束 を維持しています。ほとんどすべてのGoプログラムがこれまで通りにコンパイルおよび実行されることを期待しています。
このリリースでは、64ビットMIPS上のLinuxと32ビットx86上のAndroid への新しいポートが追加されました。GoポインタをCと共有するためのルールを定義し、強制 しました。HTTP/2の透過的で自動的なサポート が追加され、テンプレートの再利用 のための新しいメカニズムが導入されました。
言語の変更
このリリースには言語の変更はありません。
ポート
Go 1.6は、64ビットMIPS上のLinux(linux/mips64
およびlinux/mips64le
)への実験的なポートを追加しました。これらのポートはcgo
をサポートしていますが、内部リンクのみです。Go 1.6はまた、32ビットx86上のAndroid(android/386
)への実験的なポートを追加しました。FreeBSDでは、Go 1.6は外部Cコンパイラとしてgcc
ではなくclang
をデフォルトで使用します。リトルエンディアンの64ビットPowerPC上のLinux(linux/ppc64le
)では、Go 1.6は外部リンクを使用したcgo
をサポートし、ほぼ機能が完了しています。NaClでは、Go 1.5はSDKバージョンpepper-41
を必要としていましたが、Go 1.6は後のSDKバージョンをサポートしています。32ビットx86システムで-dynlink
または-shared
コンパイルモードを使用する場合、レジスタCX
は特定のメモリ参照によって上書きされるため、手書きのアセンブリでは避けるべきです。詳細はアセンブリドキュメント
を参照してください。
ツール
Cgo
cgo
には1つの大きな変更と1つの小さな変更があります。大きな変更は、GoポインタをCコードと共有するためのルールの定義であり、そのようなCコードがGoのガベージコレクタと共存できるようにすることです。簡単に言えば、GoとCは、cgo
呼び出しの一部としてCに渡されるメモリへのポインタがある場合、Goによって割り当てられたメモリを共有できます。ただし、そのメモリ自体にGoによって割り当てられたメモリへのポインタが含まれていないこと、およびCが呼び出しが戻った後にポインタを保持しないことが条件です。これらのルールはプログラム実行中にランタイムによってチェックされます。ランタイムが違反を検出すると、診断を出力してプログラムをクラッシュさせます。チェックは環境変数GODEBUG=cgocheck=0
を設定することで無効にできますが、チェックによって識別されたコードの大部分は、何らかの形でガベージコレクションと微妙に互換性がありません。チェックを無効にすると、通常はより神秘的な失敗モードにつながるだけです。チェックをオフにするよりも、問題のコードを修正することを強くお勧めします。詳細はcgoドキュメント
を参照してください。小さな変更は、Goのcomplex64
およびcomplex128
とは別に、明示的なC.complexfloat
およびC.complexdouble
型が追加されたことです。他の数値型と一致して、Cの複素数型とGoの複素数型はもはや互換性がありません。
コンパイラツールチェーン
コンパイラツールチェーンはほとんど変更されていません。内部的には、最も重要な変更は、パーサーがyacc
から生成されたものではなく、手書きになったことです。コンパイラ、リンカ、およびgo
コマンドには新しいフラグ-msan
が追加されました。これは-race
に類似しており、linux/amd64
でのみ利用可能で、Clang MemorySanitizer
との相互運用を可能にします。このような相互運用は、主に疑わしいCまたはC++コードを含むプログラムのテストに役立ちます。リンカには新しいオプション-libgcc
があり、cgo
コードをリンクする際にCコンパイラサポートライブラリの予想される場所を設定します。このオプションは-linkmode=internal
を使用する場合にのみ参照され、サポートライブラリの使用を無効にするためにnone
に設定することができます。Go 1.5で開始されたビルドモードの実装
は、より多くのシステムに拡張されました。このリリースでは、android/386
、android/amd64
、android/arm64
、linux/386
、およびlinux/arm64
でのc-shared
モードのサポートが追加されました。linux/386
、linux/arm
、linux/amd64
、およびlinux/ppc64le
でのshared
モードのサポートが追加されました。また、新しいpie
モード(位置独立実行ファイルの生成)のサポートがandroid/386
、android/amd64
、android/arm
、android/arm64
、linux/386
、linux/amd64
、linux/arm
、linux/arm64
、およびlinux/ppc64le
で追加されました。詳細は設計ドキュメント
を参照してください。リマインダーとして、リンカの-X
フラグはGo 1.5で変更されました。Go 1.4以前では、-X
は2つの引数を取りました。例:
|
|
Go 1.5では、1つの引数を使用する代替構文が追加されました。これはname=value
ペア自体です:
|
|
Go 1.5では、新しい構文の使用を提案する警告を表示した後、古い構文もまだ受け入れられていました。Go 1.6は古い構文を受け入れ、警告を表示し続けます。Go 1.7では古い構文のサポートが削除されます。
Gccgo
GCCとGoプロジェクトのリリーススケジュールは一致していません。GCCリリース5にはGo 1.4バージョンのgccgo
が含まれています。次のリリースであるGCC 6にはGo 1.6.1バージョンのgccgo
が含まれます。
Goコマンド
go
コマンドの基本的な操作は変更されていませんが、注目すべき変更がいくつかあります。Go 1.5では、GO15VENDOREXPERIMENT
環境変数を1に設定することで、ベンダリングの実験的サポートが導入されました。Go 1.6では、ベンダリングサポートが実験的と見なされなくなり、デフォルトで有効になっています。GO15VENDOREXPERIMENT
環境変数を0に設定することで明示的に無効にすることができます。Go 1.7では環境変数のサポートが削除されます。デフォルトでベンダリングを有効にすることによって引き起こされる最も可能性の高い問題は、新しいベンダリングのセマンティクスに従って解釈されることを期待していない既存のvendor
という名前のディレクトリを含むソースツリーで発生します。この場合、最も簡単な修正は、ディレクトリの名前をvendor
以外の何かに変更し、影響を受けるインポートパスを更新することです。ベンダリングの詳細については、goコマンドのドキュメント
および設計ドキュメント
を参照してください。新しいビルドフラグ-msan
が追加され、LLVMメモリサニタイザのサポートを持つGoをコンパイルします。これは主に、メモリサニタイザでチェックされているCまたはC++コードとリンクする場合に使用されます。
Go docコマンド
Go 1.5では、go doc コマンドが導入され、パッケージ名のみを使用してパッケージを参照できるようになりました。例:
|
|
曖昧さがある場合、Go 1.5の動作は、辞書順で最も早いインポートパスを持つパッケージを使用することでした。Go 1.6では、曖昧さは要素が少ないインポートパスを優先することで解決され、辞書順比較でタイを解決します。この変更の重要な効果は、オリジナルのパッケージがベンダリングされたコピーよりも優先されることです。成功した検索も通常より速く実行されます。
Go vetコマンド
go vet
コマンドは、Printf
に関数またはメソッドの値を引数として渡すことを診断するようになりました。例えば、f()
が意図されていた場合にf
を渡すといったケースです。
パフォーマンス
常にそうであるように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を行うことは困難です。いくつかのプログラムは速く実行されるかもしれませんし、遅くなるかもしれません。平均して、Go 1ベンチマークスイートのプログラムは、Go 1.5よりもGo 1.6で数パーセント速く実行されます。ガベージコレクタの停止は、特に大量のメモリを使用するプログラムにおいて、Go 1.5よりもさらに低くなっています。10%以上の改善をもたらす重要な最適化が、compress/bzip2 、compress/gzip 、crypto/aes 、crypto/elliptic 、crypto/ecdsa 、およびsort パッケージの実装に行われました。
標準ライブラリ
HTTP/2
Go 1.6は、net/http パッケージに新しいHTTP/2プロトコル の透過的なサポートを追加しました。Goクライアントとサーバーは、HTTPSを使用する際に適切にHTTP/2を自動的に使用します。HTTP/2プロトコル処理の詳細に特化した公開APIはありません。HTTP/1.1に特化した公開APIがないのと同様です。HTTP/2を無効にする必要があるプログラムは、Transport.TLSNextProto (クライアント用)またはServer.TLSNextProto (サーバー用)を非nilの空のマップに設定することで無効にできます。HTTP/2プロトコル固有の詳細を調整する必要があるプログラムは、golang.org/x/net/http2 をインポートして使用できます。特にそのConfigureServer およびConfigureTransport 関数を使用します。
ランタイム
ランタイムには、マップの同時誤用を軽量で最善の努力で検出する機能が追加されました。常にそうであるように、1つのゴルーチンがマップに書き込んでいる場合、他のゴルーチンはそのマップを同時に読み書きしてはいけません。ランタイムがこの条件を検出すると、診断を出力してプログラムをクラッシュさせます。問題についてもっと知るための最良の方法は、プログラムをレースデテクタ
の下で実行することです。これにより、レースがより確実に特定され、詳細が提供されます。プログラム終了のパニックの場合、ランタイムはデフォルトで実行中のゴルーチンのスタックのみを出力し、既存のすべてのゴルーチンを出力しません。通常、パニックに関連するのは現在のゴルーチンだけであるため、他のものを省略することでクラッシュメッセージの無関係な出力が大幅に減少します。クラッシュメッセージで全ゴルーチンのスタックを表示するには、環境変数GOTRACEBACK
をall
に設定するか、クラッシュ前にdebug.SetTraceback
を呼び出し、プログラムを再実行します。詳細はランタイムドキュメント
を参照してください。更新:プログラム全体の状態をダンプすることを意図したキャッチされないパニック、例えばタイムアウトが検出された場合や受信したシグナルを明示的に処理する場合は、パニックする前にdebug.SetTraceback("all")
を呼び出す必要があります。signal.Notify
の使用を検索することで、そのようなコードを特定するのに役立つかもしれません。Windowsでは、Go 1.5およびそれ以前のGoプログラムは、timeBeginPeriod(1)
を呼び出すことで、起動時にグローバルなWindowsタイマー解像度を1msに強制していました。Goはもはやスケジューラのパフォーマンスを向上させるためにこれを必要とせず、グローバルなタイマー解像度の変更は一部のシステムで問題を引き起こしたため、この呼び出しは削除されました。-buildmode=c-archive
または-buildmode=c-shared
を使用してアーカイブまたは共有ライブラリをビルドする場合、シグナルの処理が変更されました。Go 1.5では、アーカイブまたは共有ライブラリはほとんどのシグナルに対してシグナルハンドラをインストールしていました。Go 1.6では、Goコード内のランタイムパニックを処理するために必要な同期シグナル、すなわちSIGBUS
、SIGFPE
、SIGSEGV
に対してのみシグナルハンドラをインストールします。詳細はos/signal
パッケージを参照してください。
リフレクト
reflect
パッケージは、エクスポートされたフィールドを含む非エクスポートされた構造体型を埋め込むことに関するgc
とgccgo
ツールチェーン間の長年の非互換性を解決しました
。特にencoding/json
やencoding/xml
パッケージの精神でシリアル化を実装するために、リフレクションを使用してデータ構造を歩くコードは更新が必要になるかもしれません。この問題は、リフレクションを使用して、非エクスポートされた構造体型フィールドを通じて、その構造体のエクスポートされたフィールドにアクセスする場合に発生します。この場合、reflect
は埋め込まれたフィールドをエクスポートされたものとして誤って報告し、空のField.PkgPath
を返していました。現在は、フィールドを非エクスポートとして正しく報告しますが、構造体内に含まれるエクスポートされたフィールドへのアクセスを評価する際にはその事実を無視します。更新:通常、以前に構造体を歩いてf.PkgPath != ""
を使用してアクセスできないフィールドを除外していたコードは、現在はf.PkgPath != "" && !f.Anonymous
を使用する必要があります。例えば、encoding/json
およびencoding/xml
の実装への変更を参照してください。
ソート
sort
パッケージでは、Sort
の実装が書き直され、Interface
のLess
およびSwap
メソッドへの呼び出しが約10%減少し、対応する全体的な時間節約が得られました。新しいアルゴリズムは、Less(i, j)
およびLess(j, i)
が偽であるペアに対して、以前とは異なる順序を選択します。更新:Sort
の定義は、等しい値の最終的な順序について保証を行いませんが、新しい動作は特定の順序を期待するプログラムを壊す可能性があります。そのようなプログラムは、望ましい順序を報告するためにLess
の実装を改善するか、等しい値の元の入力順序を保持するStable
に切り替えるべきです。
テンプレート
text/template パッケージには、テンプレートの記述を容易にするための2つの重要な新機能があります。まず、テンプレートアクションの周囲のスペースをトリムする ことが可能になり、テンプレート定義がより読みやすくなります。アクションの先頭にマイナス記号を付けると、アクションの前のスペースがトリムされ、アクションの末尾にマイナス記号を付けると、アクションの後のスペースがトリムされます。例えば、テンプレート
|
|
は23<45
としてフォーマットされます。第二に、新しい{{block}}アクション
と名前付きテンプレートの再定義を許可することで、異なるインスタンスで置き換えることができるテンプレートの部分を定義する簡単な方法が提供されます。text/templateパッケージの例
がこの新機能を示しています。
ライブラリの小さな変更
archive/tar
ファイル形式のまれなコーナーケースで多くのバグを修正しました。目に見える変更の1つは、Reader
型のRead
メソッドが、特殊ファイルタイプの内容を空として提示し、即座にio.EOF
を返すようになったことです。
archive/zip
Reader 型にRegisterDecompressor メソッドが追加され、Writer 型にRegisterCompressor メソッドが追加され、個々のzipファイルの圧縮オプションを制御できるようになりました。これらは、既存のグローバルなRegisterDecompressor およびRegisterCompressor 関数よりも優先されます。
bufio
Scanner
型には、スキャン中に使用する初期バッファと最大バッファサイズを指定するためのBuffer
メソッドが追加されました。これにより、必要に応じて、MaxScanTokenSize
より大きなトークンをスキャンすることが可能になります。また、スキャナ用に、パッケージはErrFinalToken
エラー値を定義し、分割関数
が処理を中止したり、最終的な空のトークンを返したりするために使用します。
compress/flate
ReadError およびWriteError エラー実装を非推奨としました。Go 1.5では、エラーが発生した場合にのみまれに返されていましたが、現在は決して返されませんが、互換性のために定義されたままです。compress/flate 、compress/gzip 、およびcompress/zlib パッケージは、切り捨てられた入力ストリームに対してio.ErrUnexpectedEOF を報告し、io.EOF ではなくなりました。
crypto/cipher
GCM復号化の失敗時に宛先バッファを上書きするようになりました。これは、AESNIコードが一時バッファを使用しないようにするためです。
crypto/tls
Config
がnil
のCertificates
を持っている場合でも、GetCertificate
コールバックが設定されている限り、Listen
が成功するようになりました。RSAとAES-GCM暗号スイートのサポートが追加され、RecordHeaderError
が追加され、クライアント(特にnet/http
パッケージ)が非TLSサーバーへのTLS接続を試みる際により良いエラーを報告できるようになりました。
crypto/x509
負のシリアル番号を含む証明書を許可するようになりました(技術的にはエラーですが、残念ながら一般的です)。また、MD5のような安全でないアルゴリズムで署名された証明書を拒否する際に、より良いエラーメッセージを提供するために、新しいInsecureAlgorithmError を定義しています。
debug/dwarf およびdebug/elf
圧縮されたDWARFセクションのサポートを追加しました。ユーザーコードは更新を必要としません:セクションは読み取り時に自動的に解凍されます。
debug/elf
一般的な圧縮ELFセクションのサポートを追加しました。ユーザーコードは更新を必要としません:セクションは読み取り時に自動的に解凍されます。ただし、圧縮されたSections
はランダムアクセスをサポートしていません:それらはnil
のReaderAt
フィールドを持っています。
encoding/asn1
ASN.1構造の高度な解析に役立つtagおよびclass定数 をエクスポートするようになりました。また、encoding/asn1 パッケージでは、Unmarshal がさまざまな非標準の整数および長さのエンコーディングを拒否するようになりました。
encoding/base64
Decoder は、その入力の最終バイトを処理するように修正されました。以前は、可能な限り多くの4バイトトークンを処理しましたが、残りの最大3バイトを無視していました。したがって、デコーダーは未パディングのエンコーディング(RawURLEncoding など)の入力を正しく処理しますが、切り捨てられた入力や無効なバイトで終了するパディングされたエンコーディングの入力も拒否します。例えば、末尾のスペースなどです。
encoding/json
Number
の構文をマシュールする前にチェックし、数値値のJSON仕様に準拠していることを要求するようになりました。以前のリリースと同様に、ゼロのNumber
(空の文字列)はリテラルの0(ゼロ)としてマシュールされます。
encoding/xml
Marshal
関数は、引数を1つ以上の<cdata>
タグでエンコードするcdata
属性をサポートするようになりました。また、encoding/xml
パッケージでは、Decoder
のToken
メソッドが、すべての開いているタグが閉じられる前にEOFに遭遇した場合にエラーを報告するようになり、入力のタグが適切に一致するという一般的な要件と一致しています。その要件を回避するには、RawToken
を使用してください。
fmt
Printf
の*
幅および精度指定の引数として任意の整数型を許可するようになりました。以前のリリースでは、*
の引数はint
型である必要がありました。また、fmt
パッケージでは、Scanf
が%X
を使用して16進文字列をスキャンできるようになり、%x
のエイリアスとして機能します。両方のフォーマットは、大文字と小文字の16進数の任意の組み合わせを受け入れます。
image およびimage/color
非プリマルチプライドアルファを持つY’CbCr画像をサポートするためにNYCbCrA およびNYCbCrA 型を追加しました。
io
MultiWriter
実装は、WriteString
で使用するためのWriteString
メソッドを実装するようになりました。
math/big
Int
がAppend
およびText
メソッドを追加し、印刷に関するより多くの制御を提供します。また、math/big
パッケージでは、Float
がencoding.TextMarshaler
およびencoding.TextUnmarshaler
を実装し、encoding/json
およびencoding/xml
パッケージによって自然な形式でシリアル化できるようになりました。また、math/big
パッケージでは、Float
のAppend
メソッドが特別な精度引数-1
をサポートするようになりました。strconv.ParseFloat
と同様に、精度-1
は、同じ精度のFloat
に結果を読み込むParse
が元の値を生成するのに必要な最小の桁数を使用することを意味します。
math/rand
Read 関数を追加し、同様にRand がRead メソッドを追加しました。これにより、疑似ランダムなテストデータを生成することが容易になります。パッケージの他の部分と同様に、これらは暗号化設定では使用しないでください。そのような目的には、crypto/rand パッケージを使用してください。
net
ParseMAC
関数は、20バイトのIP-over-InfiniBand(IPoIB)リンク層アドレスを受け入れるようになりました。また、net
パッケージでは、DNSルックアップにいくつかの変更があります。まず、DNSError
エラー実装がError
を実装し、特にその新しいIsTemporary
メソッドがDNSサーバーエラーに対してtrue
を返すようになりました。第二に、LookupAddr
などのDNSルックアップ関数は、Plan 9およびWindowsでルート付きドメイン名(末尾にドット付き)を返すようになり、Unixシステム上のGoの動作と一致します。
net/http
すでに議論したHTTP/2サポート以外にもいくつかの小さな追加があります。まず、FileServer
は、生成されたディレクトリリストをファイル名でソートするようになりました。第二に、ServeFile
関数は、リクエストのURLパスに「..」(ドットドット)がパス要素として含まれている場合、結果を提供することを拒否するようになりました。プログラムは通常、ServeFile
を直接呼び出す代わりに、FileServer
およびDir
を使用する必要があります。URLにドットドットを含むリクエストに応じてファイルコンテンツを提供する必要があるプログラムは、ServeContent
を呼び出すことができます。第三に、Client
は、ユーザーコードがExpect: 100-continue
ヘッダーを設定できるようになりました(Transport.ExpectContinueTimeout
を参照)。第四に、5つの新しいエラーコード
があります:StatusPreconditionRequired
(428)、StatusTooManyRequests
(429)、StatusRequestHeaderFieldsTooLarge
(431)、およびRFC 6585からのStatusNetworkAuthenticationRequired
(511)、および最近承認されたStatusUnavailableForLegalReasons
(451)。第五に、CloseNotifier
の実装とドキュメントが大幅に変更されました。Hijacker
インターフェースは、以前にCloseNotifier
で使用された接続で正しく動作するようになりました。ドキュメントは、CloseNotifier
が期待される動作を説明しています。また、net/http
パッケージでは、Request
データ構造のMethod
フィールドが空の文字列に設定されている場合の処理に関連するいくつかの変更があります。空のMethod
フィールドは常に"GET"のエイリアスとして文書化されており、そのままです。ただし、Go 1.6では、空のMethod
を明示的な"GET"と同じように扱わなかったいくつかのルーチンが修正されました。特に、以前のリリースでは、Client
は、Method
が明示的に"GET"に設定されている場合にのみリダイレクトをフォローしていました。Go 1.6では、Client
は空のMethod
でもリダイレクトをフォローします。最後に、NewRequest
は、空であることが許可されていると文書化されていないmethod
引数を受け入れます。過去のリリースでは、空のmethod
引数を渡すと、空のMethod
フィールドを持つRequest
が生成されました。Go 1.6では、生成されるRequest
は常に初期化されたMethod
フィールドを持ちます:引数が空の文字列の場合、NewRequest
は返されるRequest
のMethod
フィールドを"GET"に設定します。
net/http/httptest
ResponseRecorder
は、http.Server
と同じコンテンツスニッフィングアルゴリズムを使用してデフォルトのContent-Type
ヘッダーを初期化するようになりました。
net/url
Parse は、ホスト名の解析に関してより厳格で仕様に準拠するようになりました。例えば、ホスト名にスペースが含まれている場合はもはや受け入れられません。また、net/url パッケージでは、Error 型がnet.Error を実装するようになりました。
os
IsExist
、IsNotExist
、およびIsPermission
は、SyscallError
について問い合わせる際に正しい結果を返すようになりました。Unixライクなシステムでは、os.Stdoutまたはos.Stderr
(より正確には、ファイルディスクリプタ1または2のために開かれたos.File
)への書き込みが壊れたパイプエラーのために失敗した場合、プログラムはSIGPIPE
シグナルを発生させます。デフォルトでは、これによりプログラムが終了します。これは、syscall.SIGPIPE
のためにos/signal
のNotify
関数を呼び出すことで変更できます。ファイルディスクリプタ1または2以外の壊れたパイプへの書き込みは、単にsyscall.EPIPE
(おそらくos.PathError
および/またはos.SyscallError
でラップされて)を呼び出し元に返します。壊れたパイプへの10回連続の書き込み後にキャッチできないSIGPIPE
シグナルを発生させるという古い動作はもはや発生しません。
os/exec
Cmd
のOutput
メソッドは、コマンドが不成功のステータスで終了した場合にExitError
を返し続けます。標準エラーが他の方法で破棄される場合、返されるExitError
は、失敗したコマンドの標準エラー出力のプレフィックスとサフィックス(現在32 kB)を保持し、デバッグやエラーメッセージへの含めに使用します。ExitError
のString
メソッドは、キャプチャされた標準エラーを表示しません。プログラムはデータ構造からそれを別途取得する必要があります。
path/filepath
Windowsでは、Join
関数が、ベースが相対ドライブパスである場合を正しく処理するようになりました。例えば、Join('c:', 'a')
は、過去のリリースのようにc:\a
ではなくc:a
を返します。これは、誤った結果を期待するコードに影響を与える可能性があります。
regexp
Regexp
型は常に同時ゴルーチンによる使用に安全でした。それは、正規表現検索中に使用されるスクラッチスペースのキャッシュを保護するためにsync.Mutex
を使用します。同じRegexp
を多くのゴルーチンから使用する高並列サーバーの一部は、そのミューテックスの競合によるパフォーマンスの低下を経験しました。そのようなサーバーを支援するために、Regexp
にはCopy
メソッドが追加されました。これは、元の構造の大部分を共有するが独自のスクラッチスペースキャッシュを持つRegexp
のコピーを作成します。2つのゴルーチンは、ミューテックスの競合なしに異なるRegexp
のコピーを使用できます。コピーには追加のスペースオーバーヘッドがありますので、競合が観察された場合にのみCopy
を使用するべきです。
strconv
IsGraphic
を追加し、IsPrint
に類似しています。また、QuoteToGraphic
、QuoteRuneToGraphic
、AppendQuoteToGraphic
、およびAppendQuoteRuneToGraphic
を追加し、QuoteToASCII
、QuoteRuneToASCII
などに類似しています。ASCIIファミリーは、ASCIIスペース(U+0020)を除くすべてのスペース文字をエスケープします。対照的に、グラフィックファミリーは、Unicodeスペース文字(カテゴリZs)をエスケープしません。testing
パッケージでは、テストがt.Parallel
を呼び出すと、そのテストはすべての非並列テストが完了するまで一時停止され、その後、すべての他の並列テストとともに実行を続行します。Go 1.6は、そのようなテストの報告時間を変更しました:以前は並列実行のみをカウントしていましたが、現在はテストの開始からt.Parallel
の呼び出しまでの時間もカウントします。
text/template
上記の主要な変更
に加えて、2つの小さな変更があります。まず、新しいExecError
型が追加され、Execute
中に発生するエラーで、基礎となるライターへの書き込みに起因しないものが返されます。呼び出し元は、テンプレート使用エラーとI/Oエラーを区別するためにExecError
をチェックできます。第二に、Funcs
メソッドは、FuncMap
でキーとして使用される名前がテンプレート関数呼び出しに現れることができる識別子であることを確認するようになりました。そうでない場合、Funcs
はパニックを起こします。
time
Parse 関数は、常に31を超える月の日を拒否していました。例えば、1月32日などです。Go 1.6では、Parseは非閏年の2月29日、2月30日、2月31日、4月31日、6月31日、9月31日、および11月31日も拒否するようになりました。