[インデックス 17604] ファイルの概要
このコミットは、Go 1.2のリリースノートを記述したdoc/go1.2.html
ファイルの更新に関するものです。このファイルは、Go言語の新しいバージョンがリリースされる際に、そのバージョンで導入された変更点、新機能、パフォーマンス改善、および互換性のない変更などをユーザーに伝えるための公式ドキュメントの一部です。具体的には、net/http
、encoding
、パフォーマンス関連、およびその他の標準ライブラリの変更点について記述が追加・修正されています。
コミット
commit d237f3ce6ff414e2ce8ffea9a20dda6ba603495b
Author: Rob Pike <r@golang.org>
Date: Mon Sep 16 10:28:53 2013 +1000
doc/go1.2.html: net/http, encoding, performance, library changes
Everything is done except compiler changes and additional platforms, if any.
R=golang-dev, dominik.honnef, adg
CC=golang-dev
https://golang.org/cl/13484045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d237f3ce6ff414e2ce8ffea9a20dda6ba603495b
元コミット内容
doc/go1.2.html: net/http, encoding, performance, library changes
Everything is done except compiler changes and additional platforms, if any.
R=golang-dev, dominik.honnef, adg
CC=golang-dev
https://golang.org/cl/13484045
変更の背景
このコミットは、Go 1.2のリリースに向けて、その変更点を公式ドキュメントであるdoc/go1.2.html
に反映させるために行われました。Go言語は、バージョン1.1のリリース(2013年4月)以降、リリースプロセスをより効率的にするためにリリーススケジュールを短縮しました。Go 1.2は2013年12月1日にリリースされ、このコミットはそのリリースノートの最終調整段階の一部と考えられます。
以前のバージョン(Go 1.1)のドキュメントからの赤いテキストのプレースホルダーを削除し、Go 1.2で実際に導入された変更点に関する正確な情報に置き換えることが目的です。これにより、ユーザーはGo 1.2の新機能、改善点、および互換性のない変更について、正確かつ最新の情報を得ることができます。特に、コンパイラの変更点や追加プラットフォームに関する記述を除いて、他の主要な変更点(net/http
、encoding
、パフォーマンス、その他のライブラリ変更)がこのコミットで網羅されています。
前提知識の解説
- Go言語のリリースサイクル: Go言語は定期的に新しいバージョンをリリースしており、各リリースには言語仕様の変更、ランタイムの改善、標準ライブラリの拡張、パフォーマンスの最適化などが含まれます。これらの変更は、
doc/goX.Y.html
のような形式のリリースノートで詳細に文書化されます。 doc/go1.2.html
: これはGo 1.2の公式リリースノートのHTMLドキュメントです。Goのウェブサイトで公開され、ユーザーが新しいバージョンで何が変わったかを理解するための主要な情報源となります。- 標準ライブラリ: Go言語は豊富な標準ライブラリを提供しており、ネットワーキング(
net/http
)、データエンコーディング(encoding/json
,encoding/xml
,encoding/gob
)、アーカイブ処理(archive/tar
,archive/zip
)、テキストフォーマット(fmt
)、テスト(testing
)など、多岐にわたる機能が含まれています。これらのライブラリの変更は、Goアプリケーションの動作や開発方法に直接影響を与えます。 - パフォーマンス最適化: Go言語のランタイムと標準ライブラリは、継続的にパフォーマンスの最適化が行われています。これには、特定のパッケージの処理速度向上、ネットワークI/Oの効率化、ガベージコレクションの改善などが含まれます。
os.FileInfo
インターフェース:os
パッケージで定義されているインターフェースで、ファイルやディレクトリのメタデータ(名前、サイズ、パーミッション、更新時刻など)を提供します。Name()
メソッドは、ファイルまたはディレクトリのベース名(最後のパス要素)を返すことが仕様で定められています。encoding
パッケージとマーシャリング/アンマーシャリング:encoding
パッケージは、Goのデータ構造と外部表現(JSON、XML、バイナリなど)との間でデータを変換(マーシャリング/アンマーシャリング)するための汎用的なインターフェースを定義します。これにより、異なるエンコーディング形式間で一貫したデータ変換メカニズムを提供します。fmt
パッケージのインデックス付き引数:fmt.Printf
などの関数で使用されるフォーマット文字列において、引数の位置を明示的に指定できる機能です。これにより、引数の順序に依存しない柔軟なフォーマットが可能になります。- HTTP/1.1 RFC 6265: HTTPクッキーの仕様を定義するRFC(Request for Comments)文書です。
net/http
パッケージは、このRFCに準拠してクッキーを処理します。
技術的詳細
このコミットでdoc/go1.2.html
に追加・修正された主な技術的変更点は以下の通りです。
-
パフォーマンス改善:
compress/bzip2
: 約30%の解凍速度向上。crypto/des
: 約5倍のエンコード/デコード速度向上。encoding/json
: 約30%のエンコード速度向上。- ネットワークパフォーマンス: WindowsおよびBSDシステムでのネットワークパフォーマンスが約30%向上。これは、Go 1.1でLinuxおよびOS X向けに実装されたものと同様に、ランタイムに統合されたネットワークポーラーを使用することで実現されました。
-
標準ライブラリの変更:
archive/tar
およびarchive/zip
パッケージのセマンティクス変更:- これらのパッケージが提供する
os.FileInfo
インターフェースの実装が、仕様に準拠していなかった問題が修正されました。具体的には、Name
メソッドがエントリのフルパス名を返していましたが、仕様ではベース名(最終パス要素)を返すことになっています。 - この変更は既存のプログラムを壊す可能性がありますが、この振る舞いは新しく実装されたものであり、あまり知られていなかったため、依存しているコードは少ないと想定されています。
- これらのパッケージが提供する
- 新しい
encoding
パッケージ:encoding
という新しいパッケージが導入されました。これは、encoding/xml
、encoding/json
、encoding/binary
などのパッケージでカスタムマーシャラーおよびアンマーシャラーを構築するために使用できる、一連の標準エンコーディングインターフェース(BinaryMarshaler
,BinaryUnmarshaler
,TextMarshaler
,TextUnmarshaler
)を定義します。- これらの新しいインターフェースは、標準ライブラリ内のいくつかの実装を整理するために使用されました。
fmt
パッケージ:Printf
系のフォーマット文字列でインデックス付き引数(例:fmt.Sprintf("%[3]c %[1]c %c\n", 'a', 'b', 'c')
)がサポートされました。これにより、引数の順序に依存せずにフォーマットを指定できるようになります。
encoding/gob
パッケージ:- 構造体のチャネルフィールドと関数フィールドが、エクスポートされていないかのように扱われるようになりました(完全に無視されます)。以前はエラーを引き起こす可能性があり、埋め込み構造体がそのようなフィールドを追加した場合に予期せぬ互換性の問題を引き起こす可能性がありました。
- また、上記の新しい
encoding
パッケージの汎用エンコーディングインターフェースをサポートするようになりました。
encoding/xml
パッケージ:MarshalerAttr
およびUnmarshalerAttr
インターフェースが追加されました。Encoder
型にFlush
メソッドが追加され、カスタムエンコーダーで使用できるようになりました。
net/http
パッケージ:- RFC 6265に準拠しない不正なクッキーは送信されなくなり、エラーがログに記録されるようになりました。
ReadResponse
関数が*Request
パラメータにnil
を許可するようになり、その場合はGETリクエストと見なされます。- HTTPサーバーがHEADリクエストを透過的に処理するようになりました。ハンドラーコードで特別な処理を記述する必要がなくなりました。HEADリクエストの処理中、
Handler
のResponseWriter
への書き込みはServer
によって吸収され、HTTP仕様の要件に従ってクライアントには空のボディが送信されます。
testing
パッケージ:TB
インターフェースがエクスポートされるようになりました。これはT
とB
に共通のメソッドを記録します。
コアとなるコードの変更箇所
このコミットは、doc/go1.2.html
ファイルのみを変更しています。主な変更は、Go 1.1のドキュメントからのプレースホルダー(赤いテキスト)を削除し、Go 1.2の実際の変更点に関する詳細な説明に置き換えることです。
具体的には、以下のセクションが更新されています。
- Introduction: 冒頭の赤い注意書き(RED TEXT IS FROM THE 1.1 DOC AND NEEDS TO BE UPDATED.)が削除されました。
- Additional platforms: Go 1.1に関するプラットフォームサポートの記述(赤いテキスト)が完全に削除されました。これは、Go 1.2のリリースノートではプラットフォームに関する詳細な記述が別の場所にあるか、このドキュメントでは省略されたためと考えられます。
- Performance:
- Go 1.1のパフォーマンスに関する一般的な記述(赤いテキスト)が削除され、Go 1.2での具体的な標準ライブラリのパフォーマンス改善点(
compress/bzip2
,crypto/des
,encoding/json
, ネットワークパフォーマンス)が箇条書きで詳細に記述されました。
- Go 1.1のパフォーマンスに関する一般的な記述(赤いテキスト)が削除され、Go 1.2での具体的な標準ライブラリのパフォーマンス改善点(
- Changes to the standard library:
archive/tar
andarchive/zip
: 以前のTODOコメントが削除され、os.FileInfo
インターフェースのName
メソッドのセマンティクス変更に関する詳細な説明が追加されました。- The new
encoding
package: 以前のTODOコメントが削除され、新しいencoding
パッケージの導入、その目的、定義されるインターフェース(BinaryMarshaler
,BinaryUnmarshaler
,TextMarshaler
,TextUnmarshaler
)、および関連ドキュメントへのリンクが詳細に記述されました。 fmt
package:whch
がwhich
に修正され、インデックス付き引数の例がより明確に記述されました。encoding/gob
package: 以前のTODOコメントが削除され、チャネル/関数フィールドの無視と、新しいencoding
パッケージのインターフェースサポートに関する記述が追加されました。encoding/xml
package: 以前のTODOコメントが削除され、MarshalerAttr
,UnmarshalerAttr
インターフェースの追加と、Encoder
型へのFlush
メソッドの追加に関する記述が追加されました。net/http
package: 以前のTODOコメントが削除され、不正なクッキーの送信停止、ReadResponse
の*Request
パラメータのnil
許可、HEADリクエストの透過的処理に関する詳細な記述が追加されました。testing
package:TB
インターフェースのエクスポートに関する記述が追加されました。
コアとなるコードの解説
このコミットの「コード」は、Go 1.2のリリースノートのHTMLドキュメントそのものです。したがって、変更された各行は、Go 1.2で導入された特定の機能、改善、または変更に関する情報を提供しています。
- 赤いテキストの削除: これは、Go 1.1のリリースノートからの古い情報やプレースホルダーを削除し、Go 1.2の正確な情報に置き換えるためのクリーンアップ作業です。これにより、ドキュメントの正確性と最新性が保証されます。
- パフォーマンスセクションの更新:
- 具体的なパッケージ名(
compress/bzip2
,crypto/des
,encoding/json
)と、それぞれのパフォーマンス改善率(30%速い、5倍速いなど)が明記されています。これは、Go 1.2がこれらの領域で顕著な性能向上をもたらしたことをユーザーに伝えます。 - WindowsおよびBSDでのネットワークパフォーマンス改善に関する記述は、Goランタイムがこれらのプラットフォームでより効率的なネットワークI/Oを実現したことを示しており、クロスプラットフォームでの一貫した高性能を追求するGoの姿勢を反映しています。
- 具体的なパッケージ名(
archive/tar
およびarchive/zip
のセマンティクス変更:os.FileInfo
のName
メソッドがベース名を返すように修正されたことは、Goの標準ライブラリがより厳密にインターフェースの仕様に準拠するようになったことを意味します。これは、APIの一貫性と予測可能性を高めるための重要な変更です。
- 新しい
encoding
パッケージの導入:- これは、Goのデータエンコーディングエコシステムにおける重要なアーキテクチャ変更です。汎用的なインターフェースを導入することで、異なるエンコーディング形式間でのコードの再利用性と一貫性が向上し、開発者がカスタムエンコーダー/デコーダーをより簡単に作成できるようになります。
fmt
パッケージのインデックス付き引数:- この機能は、
Printf
系のフォーマット文字列の柔軟性を大幅に向上させます。特に、国際化(i18n)やローカライゼーション(l10n)において、引数の順序が言語によって異なる場合に非常に役立ちます。
- この機能は、
encoding/gob
,encoding/xml
,net/http
,testing
パッケージの更新:- これらの変更は、各パッケージの機能強化、バグ修正、またはAPIの改善を示しています。例えば、
net/http
がRFC 6265に厳密に準拠するようになったことや、HEADリクエストの透過的処理は、ウェブアプリケーション開発における堅牢性と利便性を向上させます。encoding/gob
がチャネル/関数フィールドを無視するようになったのは、互換性の問題を回避し、より安定したシリアライゼーションを可能にするための変更です。
- これらの変更は、各パッケージの機能強化、バグ修正、またはAPIの改善を示しています。例えば、
全体として、このコミットはGo 1.2の主要な改善点と変更点を正確に文書化し、ユーザーが新しいバージョンにスムーズに移行できるようにするための重要なステップです。
関連リンク
- https://golang.org/cl/13484045 (Go Code Review)
- Go 1.2 Release Notes (公式ドキュメント)
- Go 1.2 Encoding Design Document (新しい
encoding
パッケージの設計ドキュメント) - RFC 6265: HTTP State Management Mechanism (HTTPクッキーの仕様)