[インデックス 11370] ファイルの概要
このコミットは、Go言語のバージョン1(Go 1)に関する公式ドキュメントである doc/go1.html
および doc/go1.tmpl
を更新するものです。これらのファイルは、Go 1リリースにおける重要な変更点、特に既存のコードベースに影響を与える可能性のあるAPIの変更について開発者に情報を提供することを目的としています。具体的には、hash
パッケージと net
パッケージにおける変更点の詳細を追加し、以前言及されていた html
パッケージへの参照を削除しています。
コミット
- コミットハッシュ:
03ea8b1c811007bb0c33effb782628e290f914a4
- 作者: Rob Pike r@golang.org
- コミット日時: 2012年1月24日 火曜日 16:36:40 -0800
- 変更ファイル:
doc/go1.html
: 39行変更 (28行追加, 11行削除)doc/go1.tmpl
: 39行変更 (28行追加, 11行削除)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/03ea8b1c811007bb0c33effb782628e290f914a4
元コミット内容
doc/go1: add more info about hash and net changes, delete reference to html
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5570060
変更の背景
このコミットは、Go 1のリリースに向けて、開発者向けのドキュメントをより正確かつ詳細にするために行われました。Go 1はGo言語の最初の安定版リリースであり、後方互換性を保証する重要なマイルストーンでした。そのため、既存のGoプログラムをGo 1に移行する際に必要となるAPIの変更点や、その対応方法について明確に伝えることが不可欠でした。
具体的には、以下の点が背景にあります。
hash.Hash
インターフェースのSum
メソッドの変更: ハッシュ値の計算結果を既存のバイトスライスに追加する形式に変更することで、メモリ割り当てを削減し、効率を向上させる意図がありました。この変更は、特に大量のハッシュ計算を行うアプリケーションにおいてパフォーマンス上のメリットをもたらします。net
パッケージのタイムアウトAPIの変更: 従来のSetTimeout
系のメソッドが、絶対時刻を指定するSetDeadline
系のメソッドに置き換えられました。これは、ネットワーク操作のタイムアウト処理をより柔軟かつ正確に制御できるようにするためです。相対的なタイムアウトではなく、絶対的なデッドラインを設定することで、複数の操作にまたがるタイムアウト管理が容易になります。また、net.DialTimeout
の追加は、接続確立時のタイムアウト処理を簡素化することを目的としています。html
パッケージの扱い: Go 1の初期段階ではhtml
パッケージが標準ライブラリの一部として検討されていた可能性がありますが、最終的には標準ライブラリから外れるか、あるいはその機能が他のパッケージ(例:golang.org/x/net/html
)に移管されることになったため、ドキュメントからその参照が削除されました。これは、標準ライブラリのスコープと保守性を最適化するための決定と考えられます。
これらの変更は、Go言語の設計思想である「シンプルさ」「効率性」「堅牢性」を追求した結果であり、Go 1の安定性と将来の発展のための基盤を固めるものでした。
前提知識の解説
このコミットの変更内容を理解するためには、以下のGo言語の概念とツールに関する知識が必要です。
- Go 1: Go言語の最初のメジャーリリースであり、後方互換性が保証される最初の安定版です。Go 1以降、Go言語のAPIは基本的に安定しており、既存のコードが将来のバージョンアップで動作しなくなることは稀になりました。
hash.Hash
インターフェース: Go言語のhash
パッケージで定義されているインターフェースで、ハッシュ関数が満たすべき共通の振る舞いを定義します。このインターフェースを実装することで、様々なハッシュアルゴリズム(MD5, SHA-1, SHA-256など)を統一的に扱うことができます。主要なメソッドには、データをハッシュ関数に供給するWrite
、ハッシュ値を計算して返すSum
、ハッシュ値のバイト長を返すSize
、ハッシュ関数をリセットするReset
などがあります。Sum
メソッド:hash.Hash
インターフェースの一部で、これまでにWrite
メソッドで供給されたデータに対するハッシュ値を計算し、バイトスライスとして返します。このコミットでそのシグネチャが変更されました。net
パッケージ: Go言語の標準ライブラリで、ネットワークI/O機能を提供します。TCP/UDP接続、IPアドレスの解決、HTTPクライアント/サーバーの実装など、幅広いネットワークプログラミング機能が含まれています。- タイムアウト (Timeout): ネットワーク操作において、指定された時間内に処理が完了しない場合に、その操作を中断する仕組みです。これにより、プログラムが応答しないネットワーク接続によってブロックされ続けることを防ぎ、リソースの枯渇やアプリケーションのハングアップを防ぎます。
- デッドライン (Deadline): タイムアウトの一種ですが、相対的な時間(例: 「5秒後」)ではなく、絶対的な時刻(例: 「2025年7月10日17時00分00秒」)を指定して、その時刻以降は操作がタイムアウトするように設定するものです。
gofix
ツール: Go言語のツールチェインに含まれるコマンドラインツールです。Go言語のAPIが変更された際に、古いAPIを使用しているコードを新しいAPIに自動的に書き換える機能を提供します。これにより、Go言語のバージョンアップに伴うコードの修正作業を大幅に軽減できます。ただし、すべての変更を自動的に修正できるわけではなく、セマンティックな変更(動作の意味が変わる変更)は手動での修正が必要となる場合があります。doc/go1.html
およびdoc/go1.tmpl
: Go言語の公式ドキュメントの一部で、Go 1リリースに関する変更点をまとめたページです。.tmpl
ファイルはテンプレートであり、.html
ファイルはそのテンプレートから生成される最終的なHTMLドキュメントです。
技術的詳細
このコミットでドキュメントに追記された技術的な変更点は以下の通りです。
hash
パッケージの変更
hash.Hash
インターフェースのSum
メソッドのシグネチャ変更:- 変更前:
Sum() []byte
- このシグネチャでは、
Sum
メソッドが新しいバイトスライスを割り当ててハッシュ値を返していました。
- このシグネチャでは、
- 変更後:
Sum(b []byte) []byte
- 新しいシグネチャでは、
Sum
メソッドは引数b
として与えられたバイトスライスにハッシュ値を追加 (append) して返します。これにより、呼び出し元が事前に確保したバッファを再利用できるようになり、特にループ内で頻繁にハッシュ計算を行う場合に、不要なメモリ割り当てとガベージコレクションのオーバーヘッドを削減できます。 - 後方互換性への対応: 以前の
Sum()
の動作(新しいスライスを返す)を再現するには、Sum(nil)
のようにnil
を引数として渡すことで実現できます。この場合、Sum
メソッドは内部で新しいスライスを割り当ててハッシュ値を格納し、それを返します。 gofix
による自動更新: この変更はgofix
ツールによって自動的に既存のコードが更新されます。これは、シグネチャの変更が純粋に構文的なものであり、セマンティックな変更(動作の意味が変わる変更)ではないため、ツールによる自動修正が容易であるためです。
- 新しいシグネチャでは、
- 変更前:
net
パッケージの変更
- タイムアウトAPIの変更:
- 変更前:
SetTimeout
,SetReadTimeout
,SetWriteTimeout
- これらのメソッドは、操作がタイムアウトするまでの相対的な時間(期間、例: 5秒)をナノ秒単位で指定していました。
- 変更後:
SetDeadline
,SetReadDeadline
,SetWriteDeadline
- これらのメソッドは、操作がタイムアウトする絶対的な時刻(
time.Time
型)を指定します。これにより、複数のネットワーク操作にまたがるタイムアウトをより正確に管理できるようになります。例えば、一連の操作全体にわたるデッドラインを設定し、そのデッドラインを超えたらすべての関連操作を中断するといった制御が可能です。 - セマンティックな変更と手動更新: この変更は、単なるメソッド名の変更だけでなく、タイムアウトの指定方法が「相対時間」から「絶対時刻」へとセマンティックに変わるため、
gofix
による自動更新は困難です。したがって、既存のコードは手動で修正する必要があります。開発者は、time.Now().Add(duration)
のようにして絶対時刻を計算し、新しいSetDeadline
メソッドに渡す必要があります。
- これらのメソッドは、操作がタイムアウトする絶対的な時刻(
- 変更前:
net.DialTimeout
の追加:- この新しい関数は、ネットワークアドレスへの接続(ダイヤル)操作に特化したタイムアウト機能を提供します。これにより、接続確立に時間がかかりすぎる場合に、その操作を中断してリソースの無駄な消費を防ぐことができます。これは、特に不安定なネットワーク環境や、応答しないサーバーへの接続を試みる際に有用です。
html
パッケージの参照削除
- Go 1のドキュメントから、
html
パッケージに関するセクションが完全に削除されました。これは、Go 1の標準ライブラリにはHTML5のフルパーサーを提供するhtml
パッケージが含まれないことを意味します。後に、この機能はgolang.org/x/net/html
のようなエクステンションパッケージとして提供されることになります。標準ライブラリの肥大化を防ぎ、コア機能に集中するための設計判断と考えられます。
コアとなるコードの変更箇所
このコミットは、Go言語のソースコード自体ではなく、Go 1のリリースノート/ドキュメント (doc/go1.html
と doc/go1.tmpl
) を変更しています。
変更の主要な箇所は以下の通りです。
-
hash
パッケージのSum
メソッドに関する説明の追加:doc/go1.html
およびdoc/go1.tmpl
のhash
セクションに、Sum
メソッドが[]byte
引数を取るようになったこと、およびgofix
が自動更新を行う旨の記述が追加されました。
--- a/doc/go1.html +++ b/doc/go1.html @@ -948,18 +948,20 @@ a new method, <code>BlockSize</code>. This new method is used primarily in the cryptographic libraries.\n </p>\n \n+<p>\n+The <code>Sum</code> method of the\n+<a href=\"/pkg/hash/#Hash\"><code>hash.Hash</code></a> interface now takes a\n+<code>[]byte</code> argument, to which the hash value will be appended.\n+The previous behavior can be recreated by adding a <code>nil</code> argument to the call.\n+</p>\n+\n <p>\n <em>Updating</em>:\n Existing implementations of <code>hash.Hash</code> will need to add a\n <code>BlockSize</code> method. Hashes that process the input one byte at\n a time can implement <code>BlockSize</code> to return 1.\n-</p>\n-\n-<h3 id=\"html\">The html package</h3>\n-\n-<p>\n-The <a href=\"/pkg/html/\"><code>html</code></a> package in Go 1 provides\n-a full parser for HTML5.\n+Gofix will update calls to the <code>Sum</code> methods of the various\n+implementations of <code>hash.Hash</code>.\n </p>
-
html
パッケージに関するセクションの削除:doc/go1.html
およびdoc/go1.tmpl
から、html
パッケージに関する<h3>
ヘッダーとその内容が削除されました。
--- a/doc/go1.html +++ b/doc/go1.html @@ -948,18 +948,20 @@ a new method, <code>BlockSize</code>. This new method is used primarily in the cryptographic libraries.\n </p>\n \n+<p>\n+The <code>Sum</code> method of the\n+<a href=\"/pkg/hash/#Hash\"><code>hash.Hash</code></a> interface now takes a\n+<code>[]byte</code> argument, to which the hash value will be appended.\n+The previous behavior can be recreated by adding a <code>nil</code> argument to the call.\n+</p>\n+\n <p>\n <em>Updating</em>:\n Existing implementations of <code>hash.Hash</code> will need to add a\n <code>BlockSize</code> method. Hashes that process the input one byte at\n a time can implement <code>BlockSize</code> to return 1.\n-</p>\n-\n-<h3 id=\"html\">The html package</h3>\n-\n-<p>\n-The <a href=\"/pkg/html/\"><code>html</code></a> package in Go 1 provides\n-a full parser for HTML5.\n+Gofix will update calls to the <code>Sum</code> methods of the various\n+implementations of <code>hash.Hash</code>.\n </p>
-
net
パッケージのタイムアウトAPIに関する説明の更新と追加:doc/go1.html
およびdoc/go1.tmpl
のnet
セクションに、SetTimeout
系メソッドがSetDeadline
系メソッドに置き換えられたこと、net.DialTimeout
が追加されたこと、そしてこれらの変更は手動での更新が必要である旨の記述が追加されました。
--- a/doc/go1.html +++ b/doc/go1.html @@ -1124,14 +1126,29 @@ Gofix will update almost all code affected by the change.\n \n <h3 id=\"net\">The net package</h3>\n \n-<p>In Go 1, the various <code>SetTimeout</code>,\n+<p>\n+In Go 1, the various <code>SetTimeout</code>,\n <code>SetReadTimeout</code>, and <code>SetWriteTimeout</code> methods\n-have been replaced with <code>SetDeadline</code>,\n-<code>SetReadDeadline</code>, and <code>SetWriteDeadline</code>,\n+have been replaced with \n+<a href=\"/pkg/net/#IPConn.SetDeadline\"><code>SetDeadline</code></a>,\n+<a href=\"/pkg/net/#IPConn.SetReadDeadline\"><code>SetReadDeadline</code></a>, and \n+<a href=\"/pkg/net/#IPConn.SetWriteDeadline\"><code>SetWriteDeadline</code></a>,\n respectively. Rather than taking a timeout value in nanoseconds that\n apply to any activity on the connection, the new methods set an\n absolute deadline (as a <code>time.Time</code> value) after which\n-reads and writes will time out and no longer block.</p>\n+reads and writes will time out and no longer block.\n+</p>\n+\n+<p>\n+There is also a new <a href=\"/pkg/net/#DialTimeout\">net.DialTimeout</code></a> method to simplify\n+timing out dialing a network address.\n+</p>\n+\n+<p>\n+<em>Updating</em>:\n+Code that uses the old methods will fail to compile and must be updated by hand.\n+The semantic change makes it difficult for gofix to update automatically.\n+</p>\n \n <h3 id=\"os_fileinfo\">The os.FileInfo type</h3>\n ```
コアとなるコードの解説
このコミットはGo言語のドキュメントを更新するものであり、直接的な「コアとなるコード」の変更はありません。しかし、そのドキュメントが解説しているGo 1における重要なAPI変更は、Go言語のコアライブラリの設計思想と進化を反映しています。
-
hash.Hash
のSum
メソッドの変更:- この変更は、Go言語におけるメモリ管理とパフォーマンス最適化の哲学を強く示しています。ハッシュ値を返す際に常に新しいスライスを割り当てるのではなく、既存のバッファに追記する形式にすることで、不要なメモリ割り当てとガベージコレクションの発生を抑制し、特に高頻度でハッシュ計算が行われるようなシナリオ(例: データ構造の整合性チェック、暗号化処理)での効率を向上させます。これは、Goがシステムプログラミング言語としての側面を持つことを強調する変更です。
gofix
による自動更新が可能な設計になっている点は、Go言語のツールチェインが開発者の移行コストを最小限に抑えるよう配慮されていることを示しています。
-
net
パッケージのタイムアウトAPIの変更:SetTimeout
からSetDeadline
への移行は、ネットワーク操作のタイムアウト管理をより堅牢で柔軟なものにするための重要な改善です。相対的なタイムアウトは単一の操作には便利ですが、複数の操作が連鎖するような複雑なシナリオでは、全体のタイムアウトを正確に制御するのが難しくなります。絶対的なデッドラインを設定することで、アプリケーションは特定の時刻までに処理を完了させるという明確な目標を持つことができ、より予測可能で信頼性の高いネットワークアプリケーションを構築できます。- この変更が
gofix
で自動更新できないと明記されている点は、APIのセマンティックな変更(動作の意味合いが変わる変更)は、ツールによる自動修正が困難であることを開発者に明確に伝えています。これは、Go言語のAPI設計において、後方互換性を維持しつつも、より良い設計のためにセマンティックな変更を行う場合があることを示唆しています。 net.DialTimeout
の追加は、ネットワーク接続の確立という特定のフェーズにおけるタイムアウト処理の重要性を認識し、そのための専用APIを提供することで、開発者がより簡単に堅牢なネットワーククライアントを実装できるように配慮していることを示しています。
-
html
パッケージの参照削除:- これは、Go 1の標準ライブラリのスコープに関する設計判断を反映しています。Goの標準ライブラリは「バッテリー同梱 (batteries included)」という思想を持ちつつも、無制限に肥大化するのを避ける傾向があります。HTMLパーサーのような複雑な機能は、標準ライブラリのコアから切り離し、必要に応じて
golang.org/x
リポジトリのようなエクステンションとして提供することで、標準ライブラリの保守性を高め、コアの安定性を維持する戦略が取られています。
- これは、Go 1の標準ライブラリのスコープに関する設計判断を反映しています。Goの標準ライブラリは「バッテリー同梱 (batteries included)」という思想を持ちつつも、無制限に肥大化するのを避ける傾向があります。HTMLパーサーのような複雑な機能は、標準ライブラリのコアから切り離し、必要に応じて
これらのドキュメントの変更は、Go 1が単なる新しいバージョンではなく、Go言語の設計原則と将来の方向性を明確にするための重要なマイルストーンであったことを示しています。
関連リンク
- Go言語公式ドキュメント: https://go.dev/doc/
- Go 1リリースノート (当時のもの): https://go.dev/doc/go1 (このコミットで更新されたドキュメントの最終版)
hash
パッケージドキュメント: https://pkg.go.dev/hashnet
パッケージドキュメント: https://pkg.go.dev/nettime
パッケージドキュメント: https://pkg.go.dev/timegofix
ツールに関する情報 (Goコマンドドキュメント内): https://go.dev/cmd/go/#hdr-Gofix
参考にした情報源リンク
- コミット情報:
./commit_data/11370.txt
- GitHubコミットページ: https://github.com/golang/go/commit/03ea8b1c811007bb0c33effb782628e290f914a4
- Go言語の歴史とGo 1に関する一般的な知識
- Go言語の標準ライブラリの設計原則に関する一般的な知識