Go1.5のリリースノート(日本語訳)

JavaScriptを有効にしてください

前書き

Go 1.5 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.5 Release Notes

次のバージョン:Go1.6のリリースノート(日本語訳)
前のバージョン:Go1.4のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報

Go 1.5の紹介

最新のGoリリースであるバージョン1.5は、実装における主要なアーキテクチャの変更を含む重要なリリースです。それにもかかわらず、このリリースはGo 1の互換性の約束 を維持しているため、ほとんどのGoプログラムはこれまで通りにコンパイルおよび実行されると予想しています。実装における最大の進展は次の通りです:

コンパイラとランタイムは、現在完全にGo(および少しのアセンブリ)で書かれています。Cはもはや実装に関与しておらず、以前はディストリビューションのビルドに必要だったCコンパイラはなくなりました。ガベージコレクタは現在並行 しており、可能な限り他のゴルーチンと並行して実行することで、劇的に短い停止時間を提供します。デフォルトでは、Goプログラムは利用可能なコア数に設定されたGOMAXPROCSで実行されます。以前のリリースではデフォルトは1でした。内部パッケージ のサポートは、Goコアだけでなくすべてのリポジトリに提供されるようになりました。goコマンドは、外部依存関係の「ベンダリング」に対する実験的サポート を提供します。新しいgo tool traceコマンドは、プログラムの実行の詳細なトレースをサポートします。go docコマンド(godocとは異なる)は、コマンドラインでの使用にカスタマイズされています。

これらおよびその他の実装とツールの変更については、以下で説明します。このリリースには、マップリテラルに関する小さな言語変更も含まれています。最後に、リリース のタイミングは、通常の6か月間隔から外れています。これは、この主要なリリースの準備により多くの時間を提供し、その後のスケジュールをリリース日をより便利にするために調整するためです。

言語の変更

マップリテラル

見落としにより、スライスリテラルから要素型を省略できるルールがマップキーには適用されていませんでした。これはGo 1.5で修正 されました。例を示します。Go 1.5以降、このマップリテラル:

go
1
2
3
4
5
m := map[Point]string{
    Point{29.935523, 52.891566}:   "Persepolis",
    Point{-25.352594, 131.034361}: "Uluru",
    Point{37.422455, -122.084306}: "Googleplex",
}

は、以下のようにPoint型を明示的に記載せずに書くことができます:

go
1
2
3
4
5
m := map[Point]string{
    {29.935523, 52.891566}:   "Persepolis",
    {-25.352594, 131.034361}: "Uluru",
    {37.422455, -122.084306}: "Googleplex",
}

実装

Cはもう不要

コンパイラとランタイムは現在、Goとアセンブリで実装されており、Cは使用されていません。ツリーに残っている唯一のCソースは、テストまたはcgoに関連しています。1.4以前のツリーにはCコンパイラがありました。それはランタイムをビルドするために使用されていました。カスタムコンパイラが必要だったのは、部分的にゴルーチンのスタック管理と互換性のあるCコードを保証するためでした。ランタイムが現在Goであるため、このCコンパイラは不要であり、削除されました。Cを排除するプロセスの詳細は別の場所 で説明されています。Cからの変換は、この作業のために作成されたカスタムツールの助けを借りて行われました。最も重要なのは、コンパイラが実際にCコードをGoに自動翻訳することによって移動されたことです。これは、異なる言語での同じプログラムです。新しいコンパイラの実装ではないため、このプロセスが新しいコンパイラのバグを導入していないと期待しています。このプロセスの概要は、このプレゼンテーション のスライドで利用できます。

コンパイラとツール

Goへの移行とは独立していますが、ツールの名前が変更されました。古い名前である6g8gなどはなくなり、代わりにgo tool compileとしてアクセス可能な1つのバイナリがあり、Goソースを指定された$GOARCH$GOOSのアーキテクチャとオペレーティングシステムに適したバイナリにコンパイルします。同様に、現在は1つのリンカ(go tool link)と1つのアセンブラ(go tool asm)があります。リンカは古いC実装から自動的に翻訳されましたが、アセンブラは以下で詳しく説明する新しいネイティブGo実装です。6g8gなどの名前が削除されたのと同様に、コンパイラとアセンブラの出力は現在、.oというプレーンなサフィックスが付けられ、.8.6などではありません。

ガベージコレクタ

ガベージコレクタは、設計文書 で概説された開発の一環として1.5で再設計されました。予想されるレイテンシーは、以前のリリースのコレクタよりもはるかに低く、高度なアルゴリズム、コレクタのより良いスケジューリング 、およびユーザープログラムと並行してより多くのコレクションを実行することの組み合わせによって実現されています。コレクタの「世界停止」フェーズは、ほとんどの場合10ミリ秒未満であり、通常はそれよりもはるかに短いです。ユーザーレスポンシブなウェブサイトなど、低レイテンシーが利益をもたらすシステムにとって、新しいコレクタによる予想レイテンシーの低下は重要かもしれません。新しいコレクタの詳細は、GopherCon 2015での講演 で紹介されました。

ランタイム

Go 1.5では、ゴルーチンがスケジュールされる順序が変更されました。スケジューラの特性は言語によって定義されていませんでしたが、スケジューリング順序に依存するプログラムはこの変更によって壊れる可能性があります。この変更によって影響を受けた(誤った)プログラムがいくつか見られました。スケジューリング順序に暗黙的に依存しているプログラムがある場合、それらを更新する必要があります。もう1つの潜在的に破壊的な変更は、ランタイムが同時に実行されるスレッドのデフォルト数を、GOMAXPROCSによって定義されるように、CPU上の利用可能なコア数に設定することです。以前のリリースではデフォルトは1でした。複数のコアでの実行を期待していないプログラムは、意図せずに壊れる可能性があります。制限を削除するか、GOMAXPROCSを明示的に設定することで更新できます。この変更の詳細な議論については、設計文書 を参照してください。

ビルド

GoコンパイラとランタイムがGoで実装されるようになったため、ソースからディストリビューションをコンパイルするにはGoコンパイラが必要です。したがって、Goコアをビルドするには、動作するGoディストリビューションがすでに存在している必要があります。(コアで作業しないGoプログラマーはこの変更の影響を受けません。)Go 1.4以降のディストリビューション(gccgoを含む)はすべて使用できます。詳細については、設計文書 を参照してください。

ポート

主に業界が32ビットx86アーキテクチャから移行したため、1.5で提供されるバイナリダウンロードのセットが削減されました。OS Xオペレーティングシステムのディストリビューションは、386ではなくamd64アーキテクチャのみが提供されます。同様に、Snow Leopard(Apple OS X 10.6)のポートはまだ動作しますが、Appleがそのバージョンのオペレーティングシステムを維持していないため、ダウンロードとしてリリースされず、維持されなくなりました。また、dragonfly/386ポートは、DragonflyBSD自体が32ビット386アーキテクチャをサポートしなくなったため、まったくサポートされなくなりました。ただし、ソースからビルド可能な新しいポートがいくつかあります。これには、darwin/armおよびdarwin/arm64が含まれます。新しいポートlinux/arm64はほぼ完成していますが、cgoは外部リンクを使用する場合のみサポートされています。また、実験としてppc64およびppc64le(64ビットPowerPC、大エンディアンおよび小エンディアン)が利用可能です。これらのポートはcgoをサポートしていますが、内部リンクのみです。FreeBSDでは、Go 1.5はSYSCALL命令の新しい使用のためにFreeBSD 8-STABLE+を必要とします。NaClでは、Go 1.5はSDKバージョンpepper-41を必要とします。後のpepperバージョンは、NaClランタイムからsRPCサブシステムが削除されたため、互換性がありません。Darwinでは、システムのX.509証明書インターフェースの使用は、iosビルドタグで無効にできます。Solarisポートは現在、cgoおよびnetcrypto/x509 パッケージの完全なサポートを備えており、その他の多くの修正と改善が行われています。

ツール

翻訳

ツリーからCを排除するプロセスの一環として、コンパイラとリンカはCからGoに翻訳されました。これは本物の(機械支援による)翻訳であり、新しいプログラムは基本的に古いプログラムを翻訳したものであり、新しいバグを持つ新しいものではありません。翻訳プロセスが新しいバグをほとんど、あるいはまったく導入していないと確信しており、実際に以前は知られていなかったバグがいくつか発見され、修正されました。ただし、アセンブラは新しいプログラムです。以下で説明します。

名前の変更

コンパイラ(6g8gなど)、アセンブラ(6a8aなど)、リンカ(6l8lなど)のプログラムスイートは、それぞれ環境変数GOOSGOARCHによって構成される単一のツールに統合されました。古い名前はなくなり、新しいツールはgo toolメカニズムを通じて利用可能です:go tool compilego tool asmgo tool link。また、中間オブジェクトファイルのファイルサフィックス.6.8などもなくなり、現在は単なるプレーンな.oファイルです。たとえば、amd64用にDarwinでプログラムをビルドしてリンクするには、go buildを使用せずにツールを直接使用して次のように実行します:

bash
1
2
3
$ export GOOS=darwin GOARCH=amd64
$ go tool compile program.go
$ go tool link program.o

移動

go/types パッケージがメインリポジトリに移動したため(以下参照)、vet およびcover ツールも移動しました。これらはもはや外部のgolang.org/x/toolsリポジトリで維持されていませんが、(非推奨の)ソースは古いリリースとの互換性のためにそこに残っています。

コンパイラ

前述のように、Go 1.5のコンパイラは、古いCソースから翻訳された単一のGoプログラムであり、6g8gなどを置き換えます。そのターゲットは環境変数GOOSGOARCHによって構成されます。1.5コンパイラはほとんど旧コンパイラと同等ですが、いくつかの内部詳細が変更されています。重要な変更の1つは、定数の評価がカスタム(およびあまりテストされていない)高精度算術の実装ではなく、math/big パッケージを使用するようになったことです。これが結果に影響を与えることはないと期待しています。amd64アーキテクチャのみで、コンパイラには新しいオプション-dynlinkがあり、外部共有ライブラリで定義されたGoシンボルへの参照をサポートすることで動的リンクを支援します。

アセンブラ

コンパイラとリンカと同様に、Go 1.5のアセンブラは、アセンブラのスイート(6a8aなど)を置き換える単一のプログラムであり、環境変数GOARCHGOOSによってアーキテクチャとオペレーティングシステムが構成されます。他のプログラムとは異なり、アセンブラは完全に新しいプログラムであり、Goで書かれています。新しいアセンブラは以前のものとほぼ互換性がありますが、いくつかの変更があり、一部のアセンブラソースファイルに影響を与える可能性があります。これらの変更に関する具体的な情報については、更新されたアセンブラガイド を参照してください。要約すると:

まず、定数に使用される式評価が少し異なります。現在は符号なし64ビット算術を使用し、演算子(+-<<など)の優先順位はCではなくGoから来ています。これらの変更が影響を与えるプログラムは非常に少ないと予想していますが、手動での確認が必要な場合があります。おそらくより重要なのは、SPまたはPCが番号付きレジスタのエイリアスであるマシンでは、たとえばARMのスタックポインタのR13やハードウェアプログラムカウンタのR15など、シンボルを含まないそのようなレジスタへの参照は現在違法です。たとえば、SPおよび4(SP)は違法ですが、sym+4(SP)は問題ありません。そのようなマシンでは、ハードウェアレジスタを参照するには、その真のR名を使用します。マイナーな変更の1つは、古いアセンブラの一部が次の表記を許可していたことです:

txt
1
constant=value

名前付き定数を定義するために。これは常に伝統的なCライクな#define表記で行うことが可能であり、これはまだサポートされています(アセンブラには簡略化されたCプリプロセッサの実装が含まれています)、この機能は削除されました。

リンカ

Go 1.5のリンカは現在、6l8lなどを置き換える単一のGoプログラムです。そのオペレーティングシステムと命令セットは、環境変数GOOSGOARCHによって指定されます。他にもいくつかの変更があります。最も重要なのは、リンクのスタイルを拡張する-buildmodeオプションの追加です。これにより、共有ライブラリのビルドや他の言語がGoライブラリに呼び出すことを許可するなどの状況がサポートされます。これらのいくつかは設計文書 で概説されています。利用可能なビルドモードとその使用法のリストについては、次のコマンドを実行してください:

bash
1
$ go help buildmode

また、リンカはWindows実行ファイルのヘッダーにビルドタイムスタンプを記録しなくなりました。これも修正されるかもしれませんが、Windowsのcgo実行ファイルにはいくつかのDWARF情報が欠けています。最後に、2つの引数を取る-Xフラグは、次のように:

bash
1
-X importpath.name value

現在、名前と値のペア自体を1つの引数として持つ、より一般的なGoフラグスタイルも受け入れます:

bash
1
-X importpath.name=value

古い構文もまだ機能しますが、スクリプトなどでこのフラグを使用する場合は、新しい形式に更新することをお勧めします。

Goコマンド

goコマンドの基本操作は変更されていませんが、注目すべき変更がいくつかあります。前のリリースでは、goコマンドを通じてインポートできないパッケージの内部ディレクトリのアイデアが導入されました。1.4では、コアリポジトリにいくつかの内部要素を導入することでテストされました。設計文書 で提案されたように、その変更は現在すべてのリポジトリで利用可能になっています。ルールは設計文書で説明されていますが、要約すると、internalという名前のディレクトリ内またはその下のパッケージは、同じサブツリーにルートを持つパッケージによってインポートできます。internalという名前のディレクトリエレメントを持つ既存のパッケージは、この変更によって意図せずに壊れる可能性があります。これは前回のリリースで広告された理由です。パッケージの処理方法におけるもう1つの変更は、「ベンダリング」のサポートの実験的追加です。詳細については、goコマンド のドキュメントと設計文書 を参照してください。また、いくつかの小さな変更もあります。完全な詳細については、ドキュメント をお読みください。

SWIGサポートが更新され、.swigおよび.swigcxxSWIG 3.0.6以降を必要とするようになりました。installサブコマンドは、ソースディレクトリに存在する場合、buildサブコマンドによって作成されたバイナリを削除して、ツリーに2つのバイナリが存在することによる問題を回避します。std(標準ライブラリ)ワイルドカードパッケージ名は、コマンドを除外するようになりました。新しいcmdワイルドカードはコマンドをカバーします。新しい-asmflagsビルドオプションは、アセンブラに渡すフラグを設定します。ただし、-ccflagsビルドオプションは削除されました。これは古い、現在削除されたCコンパイラに特有のものでした。新しい-buildmodeビルドオプションは、上記で説明したビルドモードを設定します。新しい-pkgdirビルドオプションは、カスタムビルドを分離するのに役立つインストールされたパッケージアーカイブの場所を設定します。新しい-toolexecビルドオプションは、コンパイラを呼び出すための異なるコマンドの置き換えを許可します。これはgo toolのカスタム置き換えとして機能します。testサブコマンドには、各テストとベンチマークを実行する回数を指定する-countフラグがあります。testing パッケージは、-test.countフラグを通じてここで作業を行います。generateサブコマンドにはいくつかの新機能があります。-runオプションは、実行するディレクティブを選択する正規表現を指定します。これは提案されましたが、1.4では実装されませんでした。実行パターンは現在、2つの新しい環境変数にアクセスできます:$GOLINEはディレクティブのソース行番号を返し、$DOLLARはドル記号に展開されます。getサブコマンドには、セキュアでないリポジトリからフェッチする場合に有効にする必要がある-insecureフラグがあります。

Go vetコマンド

go tool vetコマンドは、構造体タグのより徹底的な検証を行うようになりました。

トレースコマンド

Goプログラムの動的実行トレース用の新しいツールが利用可能です。使用法はテストカバレッジツールの動作に類似しています。トレースの生成はgo testに統合されており、その後、トレースツール自体の別の実行が結果を分析します:

bash
1
2
$ go test -trace=trace.out path/to/package
$ go tool trace [flags] pkg.test trace.out

フラグは出力をブラウザウィンドウに表示することを可能にします。詳細については、go tool trace -helpを実行してください。このトレース機能の説明は、GopherCon 2015での講演 にもあります。

Go docコマンド

数リリース前に、go docコマンドは不要として削除されました。代わりに「godoc .」を実行することが常に可能でした。1.5リリースでは、godocよりも便利なコマンドラインインターフェースを持つ新しいgo docコマンドが導入されました。これは特にコマンドラインでの使用を目的として設計されており、パッケージまたはその要素のドキュメントを、呼び出しに応じてよりコンパクトで焦点を絞った形で提供します。また、大文字小文字を区別しないマッチングと、エクスポートされていないシンボルのドキュメントを表示するサポートも提供します。詳細については「go help doc」を実行してください。

Cgo

#cgo行を解析する際に、呼び出し${SRCDIR}はソースディレクトリへのパスに展開されるようになりました。これにより、ソースコードディレクトリに対して相対的なファイルパスを含むオプションをコンパイラとリンカに渡すことができます。展開がない場合、現在の作業ディレクトリが変更されるとパスが無効になります。Solarisは現在、完全なcgoサポートを備えています。Windowsでは、cgoはデフォルトで外部リンクを使用します。C構造体がゼロサイズのフィールドで終わるが、構造体自体がゼロサイズでない場合、Goコードはもはやゼロサイズのフィールドを参照できません。そのような参照は書き直す必要があります。

パフォーマンス

常にそうであるように、変更は非常に一般的で多様であるため、パフォーマンスに関する正確な声明を行うことは困難です。このリリースでは、ガベージコレクタの新しい実装とランタイムのGoへの変換を含む、通常よりも広範な変更が行われています。一部のプログラムは高速に実行されるかもしれませんし、遅くなるかもしれません。平均して、Go 1ベンチマークスイートのプログラムは、Go 1.4よりもGo 1.5で数パーセント高速に実行されますが、上記で述べたようにガベージコレクタの停止時間は劇的に短く、ほとんどの場合10ミリ秒未満です。Go 1.5でのビルドは約2倍遅くなります。コンパイラとリンカのCからGoへの自動翻訳は、よく書かれたGoと比較してパフォーマンスが悪い非慣用的なGoコードをもたらしました。分析ツールとリファクタリングがコードの改善に役立ちましたが、まだ多くの作業が残っています。さらなるプロファイリングと最適化は、Go 1.6および将来のリリースで続けられます。詳細については、これらのスライド と関連するビデオ を参照してください。

標準ライブラリ

フラグ

flagパッケージのPrintDefaults 関数、およびFlagSet のメソッドは、より良い使用メッセージを作成するように変更されました。フォーマットはより人間に優しいものに変更され、使用メッセージ内でbackquotesで引用された単語は、使用メッセージに表示するフラグのオペランドの名前と見なされます。たとえば、次の呼び出しで作成されたフラグ:

go
1
cpuFlag = flag.Int("cpu", 1, "run `N` processes in parallel")

は、次のヘルプメッセージを表示します:

txt
1
2
-cpu N
        run N processes in parallel (default 1)

また、デフォルトは型のゼロ値でない場合にのみリストされるようになりました。

math/bigの浮動小数点数

math/big パッケージには、新しい基本データ型であるFloat が追加されました。これは任意精度の浮動小数点数を実装します。Float値は、ブール型の符号、可変長の仮数部、および32ビットの固定サイズの符号付き指数で表されます。Floatの精度(ビット単位の仮数部のサイズ)は明示的に指定することもできますし、値を作成する最初の操作によって決定されることもあります。一度作成された後、Floatの仮数部のサイズはSetPrec メソッドで変更できます。Floatは、オーバーフローによって作成される無限大の概念をサポートしていますが、IEEE 754のNaNに相当する値を引き起こすものはパニックを引き起こします。Float操作はすべてのIEEE-754丸めモードをサポートしています。精度が24(53)ビットに設定されている場合、正規化されたfloat32float64)値の範囲内に留まる操作は、それらの値に対する対応するIEEE-754算術と同じ結果を生成します。

Goタイプ

go/types パッケージはこれまでgolang.org/xリポジトリで維持されていましたが、Go 1.5からはメインリポジトリに移動しました。古い場所のコードは現在非推奨です。この移動に関連して、go/constant パッケージもメインリポジトリに移動しました。以前はgolang.org/x/tools/exactでした。go/importer パッケージもメインリポジトリに移動し、上記で説明したいくつかのツールも移動しました。

ネット

netパッケージのDNSリゾルバは、ほとんど常にシステムインターフェースにアクセスするためにcgoを使用していました。Go 1.5の変更により、ほとんどのUnixシステムではDNS解決にcgoが不要になり、これによりこれらのプラットフォームでの実行が簡素化されます。現在、システムのネットワーク設定が許可する場合、ネイティブGoリゾルバで十分です。この変更の重要な効果は、各DNS解決がスレッドではなくゴルーチンを占有することです。そのため、複数の保留中のDNSリクエストを持つプログラムは、より少ないオペレーティングシステムリソースを消費します。リゾルバをどのように実行するかの決定は、ビルド時ではなく実行時に適用されます。Goリゾルバの使用を強制するために使用されていたnetgoビルドタグはもはや必要ありませんが、まだ機能します。新しいnetcgoビルドタグは、ビルド時にcgoリゾルバの使用を強制します。実行時にcgo解決を強制するには、環境でGODEBUG=netdns=cgoを設定します。より多くのデバッグオプションはここ に文書化されています。この変更はUnixシステムにのみ適用されます。Windows、Mac OS X、およびPlan 9システムは以前と同じように動作します。

リフレクト

reflect パッケージには、ArrayOf およびFuncOf という2つの新しい関数があります。これらの関数は、既存のSliceOf 関数に類似しており、ランタイムで配列と関数を記述する新しい型を作成します。

ハードニング

標準ライブラリのいくつかのバグが、go-fuzz ツールを使用したランダム化テストを通じて発見されました。バグは、archive/tararchive/zipcompress/flateencoding/gobfmthtml/templateimage/gifimage/jpegimage/png 、およびtext/template パッケージで修正されました。これらの修正は、不正確で悪意のある入力に対する実装を強化します。

ライブラリの小さな変更

archive/zip

Writer 型には、アーカイブを書き込む出力ストリーム内の位置を指定するSetOffset メソッドが追加されました。

bufio

Reader には、入力からデータを破棄するDiscard メソッドが追加されました。

bytes

Buffer 型にバッファ内に割り当てられたバイト数を報告するCap メソッドが追加されました。同様に、bytes およびstrings パッケージの両方で、Reader 型に基になるスライスまたは文字列の元の長さを報告するSize メソッドが追加されました。bytes およびstrings パッケージには、引数内のその値を持つ最も右のバイトを見つけるLastIndexByte 関数も追加されました。crypto パッケージには、非対称復号化に使用される秘密鍵の動作を抽象化する新しいインターフェースDecrypter が追加されました。

crypto/cipher

Stream インターフェースのドキュメントが、ソースと宛先が異なる長さの場合の動作に関して明確化されました。宛先がソースよりも短い場合、メソッドはパニックを引き起こします。これは実装の変更ではなく、ドキュメントの変更です。また、crypto/cipher パッケージでは、AESのガロア/カウンタモード(GCM)で96バイト以外のノンス長をサポートするようになりました。これは一部のプロトコルで必要です。

crypto/elliptic

CurveParams 構造体にNameフィールドが追加され、パッケージで実装されている曲線に名前が付けられました。これらの名前は、ビットサイズを選択するのではなく、曲線に依存する暗号システムのために曲線を選択するより安全な方法を提供します。また、crypto/elliptic パッケージでは、Unmarshal 関数がポイントが実際に曲線上にあることを確認するようになりました。(そうでない場合、関数はnilを返します)。この変更は特定の攻撃に対する防御策です。

crypto/sha512

SHA-512ハッシュアルゴリズムの2つの切り捨てバージョンであるSHA-512/224およびSHA-512/256のサポートが追加されました。

crypto/tls

最小プロトコルバージョンは現在デフォルトでTLS 1.0です。古いデフォルトであるSSLv3は、必要に応じてConfig を通じてまだ利用可能です。crypto/tls パッケージは、RFC 6962で指定された署名付き証明書タイムスタンプ(SCT)をサポートするようになりました。サーバーは、Certificate 構造体にリストされている場合にそれらを提供し、クライアントはそれらを要求し、存在する場合はConnectionState 構造体にそれらを公開します。crypto/tls クライアント接続へのステープルOCSP応答は、以前はOCSPResponse メソッドを通じてのみ利用可能でしたが、現在はConnectionState 構造体で公開されています。crypto/tls サーバー実装は、接続のために証明書を選択するためにConfig 構造体のGetCertificate関数を常に呼び出すようになりました。最後に、crypto/tls パッケージのセッションチケットキーは、サーバーが実行中に変更できるようになりました。これは、Config 型の新しいSetSessionTicketKeys メソッドを通じて行われます。

crypto/x509

ワイルドカードは仕様 で定義されているように、最も左のラベルでのみ受け入れられるようになりました。また、crypto/x509 パッケージでは、未知のクリティカル拡張の処理が変更されました。以前は解析エラーを引き起こしていましたが、現在は解析され、Verify でのみエラーを引き起こします。Certificate の新しいフィールドUnhandledCriticalExtensionsは、これらの拡張を記録します。

database/sql

DB 型には、データベース統計を取得するためのStats メソッドが追加されました。

debug/dwarf

DWARFバージョン4をよりよくサポートするための大幅な追加があります。たとえば、新しい型Class の定義を参照してください。debug/dwarf パッケージは、DWARFラインテーブルのデコードもサポートするようになりました。

debug/elf

64ビットPowerPCアーキテクチャのサポートを追加しました。

encoding/base64

2つの新しいエンコーディング変数RawStdEncoding およびRawURLEncoding を通じて、パディングなしのエンコーディングをサポートするようになりました。

encoding/json

JSON値がアンマーシャルされるターゲット変数またはコンポーネントに適していない場合にUnmarshalTypeError を返すようになりました。encoding/jsonDecoder 型には、JSONドキュメントをデコードするためのストリーミングインターフェースを提供する新しいメソッドToken が追加されました。また、Decoder.Tokenで既に開始されたデコード操作を続行する既存のDecode機能と相互運用します。

flag

上記で説明した新しい規約を使用して使用メッセージを作成するのを支援する新しい関数UnquoteUsage が追加されました。

fmt

Value 型の値が保持しているものを印刷するようになり、reflect.ValueStringerメソッドを使用するのではなく、のようなものを生成します。

go/ast

EmptyStmt 型には、セミコロンが暗黙的に追加されたか、ソースに存在していたかを記録するブール型のImplicitフィールドが追加されました。将来の互換性のために、

go/build

Goがいつかサポートする可能性のあるいくつかのアーキテクチャのためにGOARCH値を予約しています。これはそれを約束するものではありません。また、Package 構造体には、インストールするためのアーキテクチャ依存のルートディレクトリを格納するPkgTargetRootフィールドが追加されました。

go/types

新しいQualifier 関数型をいくつかの関数への引数として使用して、パッケージレベルの名前に付加されるプレフィックスを制御することを可能にします。これはパッケージのAPI変更ですが、コアに新しく追加されたため、Go 1の互換性ルールを破るものではありません。このパッケージを使用するコードは、新しい場所で明示的に要求する必要があります。更新するには、パッケージでgo fix を実行してください。

image

Rectangle 型がImage インターフェースを実装するようになり、描画時にマスクとして機能することができます。また、image パッケージでは、一部のJPEG画像の処理を支援するために、4:1:1および4:1:0のYCbCrサブサンプリングと基本的なCMYKサポートが追加され、新しいimage.CMYK構造体で表されます。

image/color

新しいCMYK 構造体、CMYKModel カラーモデル、および一部のJPEG画像で必要なCMYKToRGB 関数を通じて、基本的なCMYKサポートを追加します。また、image/color パッケージでは、YCbCr 値のRGBAへの変換がより正確になりました。以前は、下位8ビットは上位8ビットのエコーに過ぎませんでしたが、現在はより正確な情報を含んでいます。古いコードのエコー特性のために、8ビットの赤の値を抽出するためのuint8(r)操作は機能しましたが、正しくありません。Go 1.5では、その操作は異なる値を生成する可能性があります。正しいコードは、常にそうであったように、上位8ビットを選択することです:uint8(r>>8)。ちなみに、image/drawパッケージはそのような変換をよりよくサポートしています。詳細については、このブログ投稿 を参照してください。最後に、Go 1.5以降、Index の最も近い一致チェックはアルファチャネルを尊重するようになりました。

image/gif

いくつかの一般化が含まれています。複数フレームのGIFファイルは、含まれるすべての単一フレームの境界とは異なる全体の境界を持つことができます。また、GIF 構造体には、各フレームの破棄方法を指定するDisposalフィールドが追加されました。

io

Copy に似ていますが、呼び出し元が提供するバッファを使用して、割り当てとバッファサイズを制御できるCopyBuffer 関数が追加されました。

log

タイムスタンプをUTCタイムゾーンで印刷する新しいLUTC フラグが追加されました。また、ユーザーが作成したロガーのためのSetOutput メソッドも追加されました。Go 1.4では、Max はすべての可能なNaNビットパターンを検出していませんでした。これはGo 1.5で修正され、math.Maxを使用するプログラムがNaNを含むデータで異なる動作をする可能性がありますが、現在はIEEE754のNaNの定義に従って正しく動作します。

math/big

整数用の新しいJacobi 関数と、Int 型の新しいModSqrt メソッドが追加されました。mimeパッケージには、RFC 204-エンコードされた単語を含むMIMEヘッダーをデコードするための新しいWordDecoder 型が追加されました。また、RFC 2045およびRFC 2047のエンコーディングスキームの実装として、BEncoding およびQEncoding も提供します。

mime

指定されたMIMEタイプに関連付けられていることが知られているMIME拡張を返すExtensionsByType 関数も追加されました。RFC 2045で定義された引用可能なエンコーディングを実装する新しいmime/quotedprintable パッケージがあります。

net

各IPアドレスを順番に試みて成功するまでホスト名をDial するようになりました。Dialer .DualStackモードは、最初のアドレスファミリに300msの先行時間を与えることで、Happy Eyeballs(RFC 6555 )を実装します。この値は、新しいDialer.FallbackDelayで上書きできます。net パッケージのエラーによって返される型の不一致がいくつか整理されました。ほとんどは、以前よりも多くの情報を持つOpError 値を返すようになりました。また、OpError 型には、ローカルネットワークアドレスを保持するSourceフィールドが追加されました。

net/http

サーバーHandler からトレーラーを設定するサポートが追加されました。詳細については、ResponseWriter のドキュメントを参照してください。net/http パッケージには、新しいRequest.Cancel フィールドを設定することでリクエストをキャンセルする新しいメソッドがあります。これはhttp.Transportによってサポートされています。Cancelフィールドの型は、context.Context.Done の戻り値と互換性があります。また、net/http パッケージには、ServeContent 関数でゼロのTime 値を無視するコードがあります。Go 1.5以降、Unixエポックに等しい時間値も無視されるようになりました。

net/http/fcgi

対応するエラー条件を報告するために、2つの新しいエラーErrConnClosed およびErrRequestAborted をエクスポートします。net/http/cgi パッケージには、環境変数REMOTE_ADDRおよびREMOTE_HOSTの値を誤って処理するバグがありました。これは修正されました。また、Go 1.5以降、このパッケージはREMOTE_PORT変数を設定します。

net/mail

メールアドレスを解析できるAddressParser 型が追加されました。

net/smtp

クライアントのTLS状態を返すClient 型のTLSConnectionState アクセサが追加されました。

os

Getenv に似ていますが、空の環境変数と欠落している環境変数を区別できる新しいLookupEnv 関数が追加されました。

os/signal

新しいIgnore およびReset 関数が追加されました。

runtimeruntime/trace 、およびnet/http/pprof

それぞれ上記で説明したトレース機能をサポートする新しい関数が追加されています:ReadTraceStartTraceStopTraceStartStop 、およびTrace 。詳細については、それぞれのドキュメントを参照してください。

runtime/pprof

デフォルトで現在すべてのメモリプロファイルに全体的なメモリ統計を含めています。

strings

新しいCompare 関数があります。これはbytes パッケージとの対称性を提供するために存在しますが、文字列はネイティブに比較をサポートしているため、他には必要ありません。

sync

WaitGroup 実装は、Add への呼び出しとWait からの戻りの競合を診断するようになりました。この条件を検出すると、実装はパニックを引き起こします。

syscall

LinuxのSysProcAttr構造体に、Linux 3.19のセキュリティ変更によって必要になったGidMappingsEnableSetgroupsフィールドが追加されました。すべてのUnixシステムでは、この構造体には、exec時により多くの制御を提供するための新しいForegroundおよびPgidフィールドもあります。Darwinでは、引数が多すぎる呼び出しをサポートするためにSyscall9関数が追加されました。testing/quick は、ポインタ型のnil値を生成するようになり、再帰的なデータ構造で使用できるようになりました。また、このパッケージは配列型の生成もサポートするようになりました。

text/template およびhtml/template

Go整数として表現するには大きすぎる整数定数がパースエラーを引き起こすようになりました。以前は、精度を失って浮動小数点に静かに変換されていました。また、text/template およびhtml/template パッケージでは、新しいOption メソッドが、実行中のテンプレートの動作をカスタマイズすることを可能にします。実装された唯一のオプションは、マップをインデックス化する際にキーが見つからない場合の処理方法を制御することです。デフォルトは以前と同じで、無効な値で続行することです。

time

Time型には、新しいメソッドAppendFormat が追加され、時間値を印刷する際の割り当てを回避するために使用できます。

unicode

システム全体の関連サポートは、バージョン7.0からUnicode 8.0 にアップグレードされました。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア