Go 1.6 リリースノート
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バージョンがサポートされます。
-dynlink
または-shared
コンパイルモードを使用する32ビットx86システムでは、レジスタCXは特定のメモリ参照によって上書きされるようになり、手書きのアセンブリでは避ける必要があります。詳細はアセンブリドキュメントを参照してください。
ツール¶
Cgo¶
cgo
には、1つのマイナーな変更と合わせて、1つの主要な変更があります。
主要な変更は、GoポインタとCコードの共有に関するルールの定義であり、そのようなCコードがGoのガベージコレクタと共存できるようにすることを目的としています。簡単に言うと、GoとCは、そのメモリへのポインタがcgo
呼び出しの一部としてCに渡された場合、Goによって割り当てられたメモリにGoが割り当てたメモリへのポインタが含まれておらず、呼び出しが返された後、Cがポインタを保持しない限り、Goによって割り当てられたメモリを共有できます。これらのルールは、プログラム実行中にランタイムによってチェックされます。ランタイムが違反を検出すると、診断を出力してプログラムをクラッシュさせます。環境変数GODEBUG=cgocheck=0
を設定することでチェックを無効にできますが、チェックによって識別されたコードの大部分は、何らかの形でガベージコレクションと微妙に互換性がありません。チェックを無効にすると、通常はより謎めいた失敗モードにつながるだけです。問題のコードを修正することは、チェックをオフにするよりも強く推奨されます。詳細はcgo
ドキュメントを参照してください。
マイナーな変更は、Goのcomplex64
とcomplex128
とは別に、明示的なC.complexfloat
とC.complexdouble
型を追加したことです。他の数値型と同様に、Cの複素数型とGoの複素数型は互換性がなくなりました。
コンパイラツールチェーン¶
コンパイラツールチェーンはほとんど変更されていません。内部的には、最も重要な変更は、パーサーがyaccから生成されるのではなく、手書きになったことです。
コンパイラ、リンカ、go
コマンドには、-race
と同様で、linux/amd64でのみ使用可能な新しいフラグ-msan
があり、Clang MemorySanitizerとの相互運用を有効にします。このような相互運用は、疑わしいCまたはC++コードを含むプログラムのテストに主に役立ちます。
リンカには、cgo
コードをリンクするときのCコンパイラサポートライブラリの予想される場所を設定するための新しいオプション-libgcc
があります。このオプションは、-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以前では、次のように2つの引数を受け取っていました。
-X importpath.name value
Go 1.5では、それ自体がname=value
ペアである単一の引数を使用する代替構文が追加されました。
-X importpath.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
コマンドと設計ドキュメントのドキュメントを参照してください。
LLVMメモリサニタイザのサポートを使用してGoをコンパイルする新しいビルドフラグ-msan
があります。これは、メモリサニタイザを使用してチェックされているCまたはC++コードに対してリンクする場合に主に使用することを目的としています。
Go docコマンド¶
Go 1.5では、go doc
コマンドが導入され、go
doc
http
のように、パッケージ名のみを使用してパッケージを参照できるようになりました。曖昧さが発生した場合、Go 1.5の動作は、辞書順で最も早いインポートパスを持つパッケージを使用することでした。Go 1.6では、要素の数が少ないインポートパスを優先し、辞書順比較を使用してタイを解消することで曖昧さを解決します。この変更の重要な影響は、パッケージの元の複製が、ベンダーされた複製よりも優先されるようになったことです。検索が成功する頻度も向上する傾向があります。
Go vetコマンド¶
go vet
コマンドは、f()
が意図されていた場合にf
を渡すなど、関数またはメソッドの値をPrintf
の引数として渡すことを診断するようになりました。
パフォーマンス¶
常に、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な記述を行うことは困難です。プログラムによっては実行速度が速くなる場合もあれば、遅くなる場合もあります。平均して、Go 1ベンチマークスイートのプログラムは、Go 1.6でGo 1.5よりも数パーセント高速に実行されます。ガベージコレクタの一時停止は、Go 1.5よりもさらに短く、特に大量のメモリを使用するプログラムでは顕著です。
compress/bzip2
、compress/gzip
、crypto/aes
、crypto/elliptic
、crypto/ecdsa
、sort
パッケージの実装に10%以上の改善をもたらす大きな最適化が行われました。
標準ライブラリ¶
HTTP/2¶
Go 1.6は、新しいHTTP/2プロトコルに対してnet/http
パッケージで透過的なサポートを追加します。Goクライアントとサーバーは、HTTPSを使用する場合、必要に応じて自動的にHTTP/2を使用します。HTTP/1.1に固有のエクスポートされたAPIがないのと同じように、HTTP/2プロトコル処理の詳細に固有のエクスポートされたAPIはありません。
HTTP/2を無効にする必要があるプログラムは、Transport.TLSNextProto
(クライアントの場合)またはServer.TLSNextProto
(サーバーの場合)を非nilの空のマップに設定することで実行できます。
HTTP/2プロトコル固有の詳細を調整する必要があるプログラムは、golang.org/x/net/http2
、特にそのConfigureServer関数とConfigureTransport関数をインポートして使用できます。
ランタイム¶
ランタイムは、マップの同時実行による誤用を検出するための軽量で最善を尽くす検出機能を追加しました。常に、あるゴルーチンがマップに書き込んでいる場合、他のゴルーチンは同時にそのマップを読み書きすべきではありません。ランタイムがこの状態を検出すると、診断を出力してプログラムをクラッシュさせます。問題の詳細を知る最善の方法は、race detector を使用してプログラムを実行することです。これにより、競合状態をより確実に特定し、より詳細な情報を提供します。
プログラムを終了させるパニックの場合、ランタイムはデフォルトで実行中のゴルーチンのスタックのみを出力し、既存のすべてのゴルーチンのスタックは出力しません。通常、パニックに関連するのは現在のゴルーチンのみであるため、他のゴルーチンのスタックを出力しないことで、クラッシュメッセージの不要な出力が大幅に削減されます。クラッシュメッセージで全ゴルーチンのスタックを表示するには、環境変数 `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}}
は `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` よりも大きいトークンをスキャンできます。また、`Scanner` に関して、パッケージは 分割関数 が処理を中止したり、最終的な空のトークンを返したりするために使用する `ErrFinalToken` エラー値を定義するようになりました。
- `compress/flate` パッケージは、`ReadError` と `WriteError` のエラー実装を非推奨にしました。Go 1.5 では、エラーが発生した場合にのみまれに返されていましたが、現在は決して返されなくなりました。ただし、互換性のために定義されたままです。
- `compress/flate`、`compress/gzip`、および `compress/zlib` パッケージは、切り詰められた入力ストリームに対して `io.EOF` の代わりに `io.ErrUnexpectedEOF` を報告するようになりました。
- `crypto/cipher` パッケージは、GCM 復号化に失敗した場合に、宛先バッファを上書きするようになりました。これは、AESNI コードが一時バッファを使用せずに済むようにするためです。
- `crypto/tls` パッケージには、さまざまなマイナーな変更があります。`Config` に `Certificates` が `nil` である限り、`GetCertificate` コールバックが設定されている場合に `Listen` が成功することを許可するようになりました。また、AES-GCM 暗号スイートを使用した RSA のサポートを追加し、非 TLS サーバーへの TLS 接続を試行するときに、クライアント(特に `net/http` パッケージ)がより良いエラーを報告できるように `RecordHeaderError` を追加しました。
- `crypto/x509` パッケージは、負のシリアル番号を含む証明書を許可するようになりました(技術的にはエラーですが、実際には一般的です)。また、MD5 のような安全でないアルゴリズムで署名された証明書を拒否するときに、より良いエラーメッセージを提供するために、新しい `InsecureAlgorithmError` を定義しました。
- `debug/dwarf` と `debug/elf` パッケージは、圧縮された DWARF セクションのサポートを追加しました。ユーザーコードの更新は不要です。セクションは読み取り時に自動的に解凍されます。
- `debug/elf` パッケージは、一般的な圧縮された ELF セクションのサポートを追加しました。ユーザーコードの更新は不要です。セクションは読み取り時に自動的に解凍されます。ただし、圧縮された `Sections` はランダムアクセスをサポートしません。`ReaderAt` フィールドは `nil` です。
- `encoding/asn1` パッケージは、ASN.1 構造の高度な解析に役立つタグとクラスの定数をエクスポートするようになりました。
- また、`encoding/asn1` パッケージでは、`Unmarshal` は、さまざまな非標準的な整数と長さのエンコードを拒否するようになりました。
- `encoding/base64` パッケージの`Decoder` は、入力の最後のバイトを処理するように修正されました。以前は、可能な限り多くの4バイトのトークンを処理していましたが、残りの最大3バイトは無視していました。RawURLEncoding のようなパディングされていないエンコーディングの入力を正しく処理するようになりましたが、切り詰められているか、無効なバイト(末尾のスペースなど)で終わっているパディングされたエンコーディングの入力を拒否するようになりました。
- `encoding/json` パッケージは、マーシャリングする前に `Number` の構文をチェックするようになり、数値のJSON仕様に準拠している必要があります。以前のリリースと同様に、ゼロの `Number`(空文字列)はリテラル 0(ゼロ)としてマーシャリングされます。
- `encoding/xml` パッケージの `Marshal` 関数は、`chardata` と同様ですが、引数を1つ以上の `<![CDATA[ ... ]]>` タグでエンコードする `cdata` 属性をサポートするようになりました。
- また、`encoding/xml` パッケージでは、`Decoder` の `Token` メソッドは、すべての開いているタグが閉じられる前に EOF を検出した場合にエラーを報告するようになりました。これは、入力内のタグが適切に一致するという一般的な要件と一貫しています。その要件を回避するには、`RawToken` を使用します。
- `fmt` パッケージは、`Printf` の `*` 幅と精度の指定に任意の整数型を許容するようになりました。以前のリリースでは、`*` の引数は `int` 型である必要がありました。
- また、`fmt` パッケージでは、`Scanf` は、`%x` のエイリアスとして `%X` を使用して16進文字列をスキャンできるようになりました。どちらのフォーマットも、大文字と小文字が混在する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は、Parse
で同じ精度のFloat
に読み込んだ結果が元の値と一致するのに必要な最小の桁数を表します。 math/rand
パッケージにはRead
関数が追加され、同様にRand
にはRead
メソッドが追加されました。これにより、擬似乱数テストデータの生成が容易になります。ただし、パッケージの他の部分と同様に、暗号化設定ではこれらを使用しないでください。そのような目的には、代わりにcrypto/rand
パッケージを使用してください。net
パッケージのParseMAC
関数は、20バイトのIP over InfiniBand (IPoIB)リンク層アドレスを受け入れるようになりました。- 同じく
net
パッケージでは、DNSルックアップにいくつかの変更がありました。まず、DNSError
エラーの実装がError
を実装するようになり、特に新しいIsTemporary
メソッドは、DNSサーバーエラーに対してtrueを返します。次に、LookupAddr
などのDNSルックアップ関数は、Unixシステム上のGoの動作と一致するように、Plan 9とWindowsでルート付きドメイン名(末尾にドット付き)を返すようになりました。 net/http
パッケージには、既に説明したHTTP/2サポート以外にも、いくつかのマイナーな追加があります。まず、FileServer
は、生成されたディレクトリ一覧をファイル名でソートするようになりました。次に、ServeFile
関数は、リクエストのURLパスにパス要素として「..」(ドットドット)が含まれている場合、結果の提供を拒否するようになりました。プログラムは通常、ServeFile
を直接呼び出す代わりに、FileServer
とDir
を使用する必要があります。ドットドットを含むURLへのリクエストに応答してファイルコンテンツを提供する必要があるプログラムは、引き続きServeContent
を呼び出すことができます。第三に、Client
で、ユーザーコードがExpect:
100-continue
ヘッダーを設定できるようになりました(Transport.ExpectContinueTimeout
を参照)。第四に、RFC 6585からのStatusPreconditionRequired
(428)、StatusTooManyRequests
(429)、StatusRequestHeaderFieldsTooLarge
(431)、StatusNetworkAuthenticationRequired
(511)、そして最近承認されたStatusUnavailableForLegalReasons
(451)という5つの新しいエラーコードが追加されました。第五に、CloseNotifier
の実装とドキュメントが大幅に変更されました。Hijacker
インターフェースは、以前にCloseNotifier
で使用されていた接続で正しく動作するようになりました。ドキュメントには、CloseNotifier
がいつ動作するかが記載されるようになりました。- 同じく
net/http
パッケージでは、Method
フィールドが空文字列に設定されたRequest
データ構造の処理に関するいくつかの変更があります。空の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
には、失敗したコマンドの標準エラー出力の先頭と末尾(現在32kB)が含まれるようになりました。これは、デバッグのため、またはエラーメッセージに含めるためです。ExitError
のString
メソッドは、キャプチャされた標準エラーを表示しません。プログラムは、データ構造からそれを個別に取得する必要があります。- Windowsでは、
path/filepath
パッケージのJoin
関数は、ベースが相対ドライブパスである場合に正しく処理するようになりました。たとえば、Join(`c:`,
`a`)
は、以前のリリースのように`c:\a`
ではなく、`c:a`
を返すようになりました。これは、誤った結果を期待しているコードに影響を与える可能性があります。 regexp
パッケージでは、Regexp
型は常に、同時実行ゴルーチンで使用しても安全でした。これは、正規表現検索中に使用されるスクラッチスペースのキャッシュを保護するためにsync.Mutex
を使用しています。多くのゴルーチンから同じRegexp
を使用する高並列サーバーの一部では、そのミューテックスの競合によりパフォーマンスが低下していました。そのようなサーバーを支援するために、Regexp
にはCopy
メソッドが追加されました。これは、元の構造の大部分を共有しますが、独自のスクラッチスペースキャッシュを持つRegexp
のコピーを作成します。2つのゴルーチンは、ミューテックスの競合なしに、Regexp
の異なるコピーを使用できます。コピーには追加のスペースオーバーヘッドがあるため、Copy
は競合が観測された場合にのみ使用する必要があります。strconv
パッケージには、IsPrint
と同様のIsGraphic
が追加されました。QuoteToASCII
、QuoteRuneToASCII
などと同じように、QuoteToGraphic
、QuoteRuneToGraphic
、AppendQuoteToGraphic
、AppendQuoteRuneToGraphic
も追加されました。ASCII
ファミリは、ASCIIスペース(U+0020)を除くすべてのスペース文字をエスケープします。対照的に、Graphic
ファミリは、Unicodeスペース文字(カテゴリZs)をエスケープしません。testing
パッケージでは、テストがt.Parallelを呼び出すと、そのテストは、すべての非並列テストが完了するまで一時停止され、その後、他のすべての並列テストと共に実行が続行されます。Go 1.6では、そのようなテストについて報告される時間が変更されました。以前は、並列実行のみがカウントされていましたが、現在は、テスト開始からt.Parallel
への呼び出しまでの時間もカウントされます。text/template
パッケージには、上記で説明した主要な変更に加えて、2つのマイナーな変更が含まれています。まず、基になるライターへのWrite
ではなく、Execute
中のエラーに対して返される新しいExecError
型が追加されました。呼び出し元は、ExecError
をチェックすることで、テンプレートの使用エラーとI/Oエラーを区別できます。次に、Funcs
メソッドは、FuncMap
のキーとして使用される名前が、テンプレート関数呼び出しに表示できる識別子であることをチェックするようになりました。そうでない場合、Funcs
はパニックになります。time
パッケージのParse
関数は、常に1月32日など、31より大きい日の数を拒否していました。Go 1.6では、Parse
はうるう年ではない年の2月29日、2月30日、2月31日、4月31日、6月31日、9月31日、11月31日も拒否するようになりました。