前書き
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以降、このマップリテラル:
|
|
は、以下のようにPoint
型を明示的に記載せずに書くことができます:
|
|
実装
Cはもう不要
コンパイラとランタイムは現在、Goとアセンブリで実装されており、Cは使用されていません。ツリーに残っている唯一のCソースは、テストまたはcgo
に関連しています。1.4以前のツリーにはCコンパイラがありました。それはランタイムをビルドするために使用されていました。カスタムコンパイラが必要だったのは、部分的にゴルーチンのスタック管理と互換性のあるCコードを保証するためでした。ランタイムが現在Goであるため、このCコンパイラは不要であり、削除されました。Cを排除するプロセスの詳細は別の場所
で説明されています。Cからの変換は、この作業のために作成されたカスタムツールの助けを借りて行われました。最も重要なのは、コンパイラが実際にCコードをGoに自動翻訳することによって移動されたことです。これは、異なる言語での同じプログラムです。新しいコンパイラの実装ではないため、このプロセスが新しいコンパイラのバグを導入していないと期待しています。このプロセスの概要は、このプレゼンテーション
のスライドで利用できます。
コンパイラとツール
Goへの移行とは独立していますが、ツールの名前が変更されました。古い名前である6g
、8g
などはなくなり、代わりにgo tool compile
としてアクセス可能な1つのバイナリがあり、Goソースを指定された$GOARCH
と$GOOS
のアーキテクチャとオペレーティングシステムに適したバイナリにコンパイルします。同様に、現在は1つのリンカ(go tool link
)と1つのアセンブラ(go tool asm
)があります。リンカは古いC実装から自動的に翻訳されましたが、アセンブラは以下で詳しく説明する新しいネイティブGo実装です。6g
、8g
などの名前が削除されたのと同様に、コンパイラとアセンブラの出力は現在、.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
およびnet
とcrypto/x509
パッケージの完全なサポートを備えており、その他の多くの修正と改善が行われています。
ツール
翻訳
ツリーからCを排除するプロセスの一環として、コンパイラとリンカはCからGoに翻訳されました。これは本物の(機械支援による)翻訳であり、新しいプログラムは基本的に古いプログラムを翻訳したものであり、新しいバグを持つ新しいものではありません。翻訳プロセスが新しいバグをほとんど、あるいはまったく導入していないと確信しており、実際に以前は知られていなかったバグがいくつか発見され、修正されました。ただし、アセンブラは新しいプログラムです。以下で説明します。
名前の変更
コンパイラ(6g
、8g
など)、アセンブラ(6a
、8a
など)、リンカ(6l
、8l
など)のプログラムスイートは、それぞれ環境変数GOOS
とGOARCH
によって構成される単一のツールに統合されました。古い名前はなくなり、新しいツールはgo tool
メカニズムを通じて利用可能です:go tool compile
、go tool asm
、go tool link
。また、中間オブジェクトファイルのファイルサフィックス.6
、.8
などもなくなり、現在は単なるプレーンな.o
ファイルです。たとえば、amd64
用にDarwinでプログラムをビルドしてリンクするには、go build
を使用せずにツールを直接使用して次のように実行します:
|
|
移動
go/types
パッケージがメインリポジトリに移動したため(以下参照)、vet
およびcover
ツールも移動しました。これらはもはや外部のgolang.org/x/tools
リポジトリで維持されていませんが、(非推奨の)ソースは古いリリースとの互換性のためにそこに残っています。
コンパイラ
前述のように、Go 1.5のコンパイラは、古いCソースから翻訳された単一のGoプログラムであり、6g
、8g
などを置き換えます。そのターゲットは環境変数GOOS
とGOARCH
によって構成されます。1.5コンパイラはほとんど旧コンパイラと同等ですが、いくつかの内部詳細が変更されています。重要な変更の1つは、定数の評価がカスタム(およびあまりテストされていない)高精度算術の実装ではなく、math/big
パッケージを使用するようになったことです。これが結果に影響を与えることはないと期待しています。amd64
アーキテクチャのみで、コンパイラには新しいオプション-dynlink
があり、外部共有ライブラリで定義されたGoシンボルへの参照をサポートすることで動的リンクを支援します。
アセンブラ
コンパイラとリンカと同様に、Go 1.5のアセンブラは、アセンブラのスイート(6a
、8a
など)を置き換える単一のプログラムであり、環境変数GOARCH
とGOOS
によってアーキテクチャとオペレーティングシステムが構成されます。他のプログラムとは異なり、アセンブラは完全に新しいプログラムであり、Goで書かれています。新しいアセンブラは以前のものとほぼ互換性がありますが、いくつかの変更があり、一部のアセンブラソースファイルに影響を与える可能性があります。これらの変更に関する具体的な情報については、更新されたアセンブラガイド
を参照してください。要約すると:
まず、定数に使用される式評価が少し異なります。現在は符号なし64ビット算術を使用し、演算子(+
、-
、<<
など)の優先順位はCではなくGoから来ています。これらの変更が影響を与えるプログラムは非常に少ないと予想していますが、手動での確認が必要な場合があります。おそらくより重要なのは、SP
またはPC
が番号付きレジスタのエイリアスであるマシンでは、たとえばARMのスタックポインタのR13
やハードウェアプログラムカウンタのR15
など、シンボルを含まないそのようなレジスタへの参照は現在違法です。たとえば、SP
および4(SP)
は違法ですが、sym+4(SP)
は問題ありません。そのようなマシンでは、ハードウェアレジスタを参照するには、その真のR
名を使用します。マイナーな変更の1つは、古いアセンブラの一部が次の表記を許可していたことです:
|
|
名前付き定数を定義するために。これは常に伝統的なCライクな#define
表記で行うことが可能であり、これはまだサポートされています(アセンブラには簡略化されたCプリプロセッサの実装が含まれています)、この機能は削除されました。
リンカ
Go 1.5のリンカは現在、6l
、8l
などを置き換える単一のGoプログラムです。そのオペレーティングシステムと命令セットは、環境変数GOOS
とGOARCH
によって指定されます。他にもいくつかの変更があります。最も重要なのは、リンクのスタイルを拡張する-buildmode
オプションの追加です。これにより、共有ライブラリのビルドや他の言語がGoライブラリに呼び出すことを許可するなどの状況がサポートされます。これらのいくつかは設計文書
で概説されています。利用可能なビルドモードとその使用法のリストについては、次のコマンドを実行してください:
|
|
また、リンカはWindows実行ファイルのヘッダーにビルドタイムスタンプを記録しなくなりました。これも修正されるかもしれませんが、Windowsのcgo
実行ファイルにはいくつかのDWARF
情報が欠けています。最後に、2つの引数を取る-X
フラグは、次のように:
|
|
現在、名前と値のペア自体を1つの引数として持つ、より一般的なGoフラグスタイルも受け入れます:
|
|
古い構文もまだ機能しますが、スクリプトなどでこのフラグを使用する場合は、新しい形式に更新することをお勧めします。
Goコマンド
go
コマンドの基本操作は変更されていませんが、注目すべき変更がいくつかあります。前のリリースでは、go
コマンドを通じてインポートできないパッケージの内部ディレクトリのアイデアが導入されました。1.4では、コアリポジトリにいくつかの内部要素を導入することでテストされました。設計文書
で提案されたように、その変更は現在すべてのリポジトリで利用可能になっています。ルールは設計文書で説明されていますが、要約すると、internal
という名前のディレクトリ内またはその下のパッケージは、同じサブツリーにルートを持つパッケージによってインポートできます。internal
という名前のディレクトリエレメントを持つ既存のパッケージは、この変更によって意図せずに壊れる可能性があります。これは前回のリリースで広告された理由です。パッケージの処理方法におけるもう1つの変更は、「ベンダリング」のサポートの実験的追加です。詳細については、goコマンド
のドキュメントと設計文書
を参照してください。また、いくつかの小さな変更もあります。完全な詳細については、ドキュメント
をお読みください。
SWIG
サポートが更新され、.swig
および.swigcxx
はSWIG 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
に統合されており、その後、トレースツール自体の別の実行が結果を分析します:
|
|
フラグは出力をブラウザウィンドウに表示することを可能にします。詳細については、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
で引用された単語は、使用メッセージに表示するフラグのオペランドの名前と見なされます。たとえば、次の呼び出しで作成されたフラグ:
|
|
は、次のヘルプメッセージを表示します:
|
|
また、デフォルトは型のゼロ値でない場合にのみリストされるようになりました。
math/bigの浮動小数点数
math/big
パッケージには、新しい基本データ型であるFloat
が追加されました。これは任意精度の浮動小数点数を実装します。Float
値は、ブール型の符号、可変長の仮数部、および32ビットの固定サイズの符号付き指数で表されます。Float
の精度(ビット単位の仮数部のサイズ)は明示的に指定することもできますし、値を作成する最初の操作によって決定されることもあります。一度作成された後、Float
の仮数部のサイズはSetPrec
メソッドで変更できます。Float
は、オーバーフローによって作成される無限大の概念をサポートしていますが、IEEE 754のNaN
に相当する値を引き起こすものはパニックを引き起こします。Float
操作はすべてのIEEE-754丸めモードをサポートしています。精度が24(53)ビットに設定されている場合、正規化されたfloat32
(float64
)値の範囲内に留まる操作は、それらの値に対する対応する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/tar 、archive/zip 、compress/flate 、encoding/gob 、fmt 、html/template 、image/gif 、image/jpeg 、image/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/json
のDecoder
型には、JSONドキュメントをデコードするためのストリーミングインターフェースを提供する新しいメソッドToken
が追加されました。また、Decoder.Token
で既に開始されたデコード操作を続行する既存のDecode
機能と相互運用します。
flag
上記で説明した新しい規約を使用して使用メッセージを作成するのを支援する新しい関数UnquoteUsage が追加されました。
fmt
Value
型の値が保持しているものを印刷するようになり、reflect.Value
のStringer
メソッドを使用するのではなく、のようなものを生成します。
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 関数が追加されました。
runtime 、runtime/trace 、およびnet/http/pprof
それぞれ上記で説明したトレース機能をサポートする新しい関数が追加されています:ReadTrace 、StartTrace 、StopTrace 、Start 、Stop 、および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 にアップグレードされました。