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

[インデックス 17604] ファイルの概要

このコミットは、Go 1.2のリリースノートを記述したdoc/go1.2.htmlファイルの更新に関するものです。このファイルは、Go言語の新しいバージョンがリリースされる際に、そのバージョンで導入された変更点、新機能、パフォーマンス改善、および互換性のない変更などをユーザーに伝えるための公式ドキュメントの一部です。具体的には、net/httpencoding、パフォーマンス関連、およびその他の標準ライブラリの変更点について記述が追加・修正されています。

コミット

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/httpencoding、パフォーマンス、その他のライブラリ変更)がこのコミットで網羅されています。

前提知識の解説

  • 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に追加・修正された主な技術的変更点は以下の通りです。

  1. パフォーマンス改善:

    • compress/bzip2: 約30%の解凍速度向上。
    • crypto/des: 約5倍のエンコード/デコード速度向上。
    • encoding/json: 約30%のエンコード速度向上。
    • ネットワークパフォーマンス: WindowsおよびBSDシステムでのネットワークパフォーマンスが約30%向上。これは、Go 1.1でLinuxおよびOS X向けに実装されたものと同様に、ランタイムに統合されたネットワークポーラーを使用することで実現されました。
  2. 標準ライブラリの変更:

    • archive/tar および archive/zip パッケージのセマンティクス変更:
      • これらのパッケージが提供するos.FileInfoインターフェースの実装が、仕様に準拠していなかった問題が修正されました。具体的には、Nameメソッドがエントリのフルパス名を返していましたが、仕様ではベース名(最終パス要素)を返すことになっています。
      • この変更は既存のプログラムを壊す可能性がありますが、この振る舞いは新しく実装されたものであり、あまり知られていなかったため、依存しているコードは少ないと想定されています。
    • 新しい encoding パッケージ:
      • encodingという新しいパッケージが導入されました。これは、encoding/xmlencoding/jsonencoding/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リクエストの処理中、HandlerResponseWriterへの書き込みはServerによって吸収され、HTTP仕様の要件に従ってクライアントには空のボディが送信されます。
    • testing パッケージ:
      • TBインターフェースがエクスポートされるようになりました。これはTBに共通のメソッドを記録します。

コアとなるコードの変更箇所

このコミットは、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, ネットワークパフォーマンス)が箇条書きで詳細に記述されました。
  • Changes to the standard library:
    • archive/tar and archive/zip: 以前のTODOコメントが削除され、os.FileInfoインターフェースのNameメソッドのセマンティクス変更に関する詳細な説明が追加されました。
    • The new encoding package: 以前のTODOコメントが削除され、新しいencodingパッケージの導入、その目的、定義されるインターフェース(BinaryMarshaler, BinaryUnmarshaler, TextMarshaler, TextUnmarshaler)、および関連ドキュメントへのリンクが詳細に記述されました。
    • fmt package: whchwhichに修正され、インデックス付き引数の例がより明確に記述されました。
    • 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.FileInfoNameメソッドがベース名を返すように修正されたことは、Goの標準ライブラリがより厳密にインターフェースの仕様に準拠するようになったことを意味します。これは、APIの一貫性と予測可能性を高めるための重要な変更です。
  • 新しい encoding パッケージの導入:
    • これは、Goのデータエンコーディングエコシステムにおける重要なアーキテクチャ変更です。汎用的なインターフェースを導入することで、異なるエンコーディング形式間でのコードの再利用性と一貫性が向上し、開発者がカスタムエンコーダー/デコーダーをより簡単に作成できるようになります。
  • fmt パッケージのインデックス付き引数:
    • この機能は、Printf系のフォーマット文字列の柔軟性を大幅に向上させます。特に、国際化(i18n)やローカライゼーション(l10n)において、引数の順序が言語によって異なる場合に非常に役立ちます。
  • encoding/gob, encoding/xml, net/http, testing パッケージの更新:
    • これらの変更は、各パッケージの機能強化、バグ修正、またはAPIの改善を示しています。例えば、net/httpがRFC 6265に厳密に準拠するようになったことや、HEADリクエストの透過的処理は、ウェブアプリケーション開発における堅牢性と利便性を向上させます。encoding/gobがチャネル/関数フィールドを無視するようになったのは、互換性の問題を回避し、より安定したシリアライゼーションを可能にするための変更です。

全体として、このコミットはGo 1.2の主要な改善点と変更点を正確に文書化し、ユーザーが新しいバージョンにスムーズに移行できるようにするための重要なステップです。

関連リンク

参考にした情報源リンク