Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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の変更点や、その対応方法について明確に伝えることが不可欠でした。

具体的には、以下の点が背景にあります。

  1. hash.Hash インターフェースの Sum メソッドの変更: ハッシュ値の計算結果を既存のバイトスライスに追加する形式に変更することで、メモリ割り当てを削減し、効率を向上させる意図がありました。この変更は、特に大量のハッシュ計算を行うアプリケーションにおいてパフォーマンス上のメリットをもたらします。
  2. net パッケージのタイムアウトAPIの変更: 従来の SetTimeout 系のメソッドが、絶対時刻を指定する SetDeadline 系のメソッドに置き換えられました。これは、ネットワーク操作のタイムアウト処理をより柔軟かつ正確に制御できるようにするためです。相対的なタイムアウトではなく、絶対的なデッドラインを設定することで、複数の操作にまたがるタイムアウト管理が容易になります。また、net.DialTimeout の追加は、接続確立時のタイムアウト処理を簡素化することを目的としています。
  3. 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.htmldoc/go1.tmpl) を変更しています。

変更の主要な箇所は以下の通りです。

  1. hash パッケージの Sum メソッドに関する説明の追加:

    • doc/go1.html および doc/go1.tmplhash セクションに、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>
    
  2. 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>
    
  3. net パッケージのタイムアウトAPIに関する説明の更新と追加:

    • doc/go1.html および doc/go1.tmplnet セクションに、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.HashSum メソッドの変更:

    • この変更は、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言語の設計原則と将来の方向性を明確にするための重要なマイルストーンであったことを示しています。

関連リンク

参考にした情報源リンク