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

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

このドキュメントは、Go言語の公式リポジトリにおけるコミット 0a1376a1df34d84a85ca7195f0499f012e62275d について、その技術的な詳細と背景を包括的に解説します。このコミットは、Go 1リリースに向けたドキュメントの再編成とパッケージ構造の変更に関する重要な内容を含んでいます。

コミット

commit 0a1376a1df34d84a85ca7195f0499f012e62275d
Author: Rob Pike <r@golang.org>
Date:   Fri Jan 20 14:28:48 2012 -0800

    doc/go1: rearrange a bit, sort the packages
    This should make it easier to add the zillion little changes coming.
    No content change here beyond a couple of introductory sentences.
    Sections have been moved wholesale without editing them.
    
    R=golang-dev, rsc, gri
    CC=golang-dev
    https://golang.org/cl/5557074

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/0a1376a1df34d84a85ca7195f0499f012e62275d

元コミット内容

このコミットの目的は、doc/go1.html および doc/go1.tmpl ファイル内のGo 1リリースに関するドキュメントを再編成し、パッケージの記述順序をソートすることです。これにより、今後予定されている多数の小さな変更をドキュメントに追加しやすくすることが意図されています。内容自体には、いくつかの導入文を除いて変更はなく、セクション全体が編集なしで移動されています。

変更の背景

Go 1のリリースは、Go言語にとって最初の安定版であり、後方互換性を保証する重要なマイルストーンでした。このリリースに向けて、Goの標準ライブラリやツールチェインには多くの変更が加えられました。これらの変更をユーザーに明確に伝えるため、公式ドキュメント、特にGo 1の変更点をまとめた doc/go1 は非常に重要でした。

このコミットが行われた2012年1月20日は、Go 1の正式リリース(2012年3月28日)の約2ヶ月前であり、まさに最終調整の段階でした。この時期には、APIの微調整、パッケージの再編成、非推奨化、削除など、多岐にわたる変更が頻繁に行われていました。このような状況下で、ドキュメントが整理されていないと、新しい変更を追記する際に混乱が生じやすくなります。

したがって、このコミットの背景には、Go 1リリースに向けたドキュメントのメンテナンス性を向上させ、今後の変更をスムーズに統合できるようにするという明確な目的がありました。特に、パッケージに関する記述が頻繁に変更されることが予想されたため、パッケージの記述順序をソートし、関連するセクションをまとめることで、ドキュメントの構造をより論理的かつ管理しやすくすることが求められました。

前提知識の解説

このコミットを理解するためには、以下のGo言語に関する前提知識が必要です。

  • Go 1リリース: Go言語の最初の安定版リリースであり、後方互換性が保証されるようになった重要なバージョンです。Go 1以降、既存のGoプログラムが将来のGoバージョンで動作し続けることが原則として保証されるようになりました。
  • Goパッケージシステム: Go言語は、コードをパッケージという単位で整理します。標準ライブラリも多数のパッケージで構成されており、それぞれが特定の機能を提供します。
  • go fix ツール: Go言語には、古いAPIの使用を新しいAPIに自動的に更新する go fix というツールが存在します。これは、Go言語の進化に伴うコードの移行を支援するために非常に重要なツールです。このコミットの差分にも gofix が言及されており、自動更新の対象となる変更と手動更新が必要な変更が区別されています。
  • exp ディレクトリ: Goの標準ライブラリには、exp (experimental) というディレクトリが存在しました。このディレクトリ内のパッケージは実験的なものであり、APIの安定性が保証されていませんでした。Go 1リリースでは、一部の exp パッケージが標準ライブラリに昇格したり、逆に exp に移動されたり、削除されたりしました。
  • old ディレクトリ: old ディレクトリは、非推奨となったパッケージや、Go 1リリースで標準ライブラリから削除されたパッケージを一時的に保持するために使用されました。これらのパッケージは、将来的に完全に削除されることが想定されていました。
  • os.FileInfo インターフェース: os パッケージは、ファイルシステム操作を提供します。os.FileInfo は、ファイルに関する情報(名前、サイズ、パーミッション、更新時刻など)を抽象化するインターフェースです。Go 1では、このインターフェースの定義が変更され、より柔軟な設計になりました。特に、システム固有のファイル詳細(Unixのi-numberなど)は Sys フィールドを通じてアクセスするようになりました。
  • go/* パッケージ: go ディレクトリ配下には、Go言語のソースコード解析、ドキュメント生成、トークン化など、Go言語自体を扱うためのツールやライブラリが含まれています。例えば、go/scanner は字句解析、go/parser は構文解析、go/doc はドキュメント生成、go/token はトークン表現を扱います。Go 1では、これらのパッケージのAPIも整理・変更されました。
  • strconv パッケージ: 文字列と数値の変換を行うパッケージです。Go 1では、このパッケージのAPIも一部変更されました。

技術的詳細

このコミットは、主にGo 1リリースノートのHTMLドキュメント (doc/go1.htmldoc/go1.tmpl) の構造変更に焦点を当てています。具体的な技術的変更点は以下の通りです。

  1. セクションの再編成:

    • Changes to the library という見出しが The package hierarchy に変更され、パッケージ階層に関する説明が冒頭に移動されました。
    • Major changes to the libraryMinor changes to the library という新しいセクションが導入され、ライブラリの変更点が影響度に応じて分類されました。
    • The os.FileInfo typeThe go/* packages に関する記述が、Minor changes to the library セクション内に移動されました。これは、これらの変更が広範囲に影響するものの、go fix ツールによる自動更新が可能であるか、または手動での更新が必要なケースが限定的であると判断されたためと考えられます。
  2. パッケージの分類と説明の追加:

    • exp パッケージツリー: exp ディレクトリ下のパッケージ(ebnf, go/types, http/spdy, exp/utf8string など)がGo 1の標準リリースには含まれないことが明記されました。これらのパッケージは実験的な性質を持つため、開発者が利用したい場合はリポジトリからソースコードを取得する必要があることが強調されています。また、gotype コマンドが exp/gotype に、ebnflintexp/ebnflint に移動したことも記載されています。
    • old パッケージツリー: 非推奨となった old ディレクトリ下のパッケージ(old/netchan, old/regexp, old/template など)もGo 1の標準リリースには含まれないことが明記されました。これらは将来的に削除される予定のパッケージです。
    • 削除されたパッケージ: container/vector, exp/datafmt, go/typechecker, try といったパッケージ、および gotry コマンドがGo 1で完全に削除されたことが明記されました。特に container/vector の代替としてスライスを直接使用することが推奨され、Go Wikiへのリンクが提供されています。
    • サブリポジトリへの移動: crypto/openpgpexp/ssh など、一部のパッケージがサブリポジトリに移動する可能性が示唆されています(コメントアウトされたTODOとして)。これは、標準ライブラリの肥大化を防ぎ、より専門的なパッケージを独立して管理するためのGoの戦略の一部です。
  3. API変更の詳細な説明:

    • os.FileInfo の変更: os.FileInfo が構造体からインターフェースに変更されたことが詳細に説明されています。これにより、ファイル情報の取得がより抽象化され、システム固有の詳細は Sys フィールドを通じてアクセスするようになりました。更新方法として go fix による自動更新と、システム固有の詳細を扱う場合の手動更新の必要性が示されています。
    • go/* パッケージの変更:
      • go/scanner から AllowIllegalCharsInsertSemis モードが削除され、汎用的なテキストスキャンには text/scanner パッケージの使用が推奨されています。
      • go/parser のパース関数が ParseFile, ParseDir, ParseExpr に集約されました。
      • go/doc パッケージの型名が Doc サフィックスなしで簡素化され(例: PackageDoc -> Package)、doc.New 関数が導入されました。
      • go/token パッケージの token.FileSet メソッド FilesIterate に置き換えられました。
      • これらの go/* パッケージの変更は、コンパイラが不正な使用を拒否するため、手動での更新が必要であることが強調されています。
    • strconv パッケージの変更: strconv パッケージのAPI変更についても言及されており、go fix が警告を出すものの、一部のケースでは手動でのキャスト追加が必要となる可能性が示唆されています。

これらの変更は、Go 1が安定した基盤を提供するために、標準ライブラリのAPIを整理し、将来の拡張性を考慮した設計に移行する過程の一部を示しています。

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

このコミットのコアとなるコードの変更箇所は、doc/go1.htmldoc/go1.tmpl ファイル内のHTML構造とテキストコンテンツの移動および追加です。

具体的には、以下のセクションが大きく移動・追加されています。

  • doc/go1.html および doc/go1.tmpl の両方で、
    • <h2 id="library">Changes to the library</h2><h2 id="packages">The package hierarchy</h2> に変更され、その下にパッケージ階層に関する導入文が追加されています。
    • <h3 id="exp">The package tree exp</h3> セクションが、The package hierarchy の直後に移動・追加されています。
    • <h3 id="old">The package tree old</h3> セクションが、exp セクションの直後に移動・追加されています。
    • <h3 id="deleted">Deleted packages</h3> セクションが、old セクションの直後に移動・追加されています。
    • <h3 id="subrepo">Packages moving to subrepositories</h3> セクションが追加されています(コメントアウトされたTODOを含む)。
    • <h2 id="major">Major changes to the library</h2> セクションが追加され、その下に The error type and errors package など、主要な変更に関する記述が移動されています。
    • <h2 id="minor">Minor changes to the library</h2> セクションが追加され、その下に The crypto/elliptic package, The crypto/x509 package, The go/* packages, The hash package, The os.FileInfo type, The strconv package など、より詳細な変更に関する記述が移動されています。

これらの変更は、主にHTMLの <h2> および <h3> タグで区切られたセクションの順序変更と、それに伴うコンテンツの移動によって行われています。

コアとなるコードの解説

このコミットにおける「コード」とは、Go言語のソースコードではなく、Go 1リリースノートのドキュメントを構成するHTML(およびテンプレート)ファイルです。したがって、コアとなるコードの解説は、これらのドキュメントの構造変更とその意図に焦点を当てます。

変更の核心は、Go 1の標準ライブラリにおけるパッケージの変更点を、ユーザーがより理解しやすいように論理的に再編成した点にあります。

  1. パッケージ階層の明確化: 以前は Changes to the library という一般的な見出しの下に様々な変更が混在していましたが、The package hierarchy という新しいセクションを設けることで、Go 1におけるパッケージの再編成(移動、リネーム、削除)に特化した説明を冒頭に配置しました。これにより、ユーザーはまずGoのパッケージ構造全体にどのような変更があったのかを把握できるようになります。

  2. 実験的・非推奨・削除パッケージの分離:

    • exp (experimental) パッケージは、標準ライブラリには含まれないものの、ソースコードとしては利用可能であることを明確にしました。これは、Go開発者が将来的に標準化される可能性のある機能を試すための指針となります。
    • old (deprecated) パッケージは、非推奨であり、標準リリースには含まれないことを示しました。これにより、ユーザーはこれらのパッケージの使用を避けるべきであるというメッセージを受け取ります。
    • Deleted packages セクションを設けることで、Go 1で完全に削除されたパッケージを明確にリストアップし、既存コードの移行パス(例: container/vector からスライスへの移行)を提供しています。

    これらの分離により、ユーザーはGo 1で利用可能な安定したAPIと、そうでないAPIを明確に区別できるようになります。

  3. 変更の重要度に応じた分類:

    • Major changes to the libraryMinor changes to the library という二つのセクションを導入することで、ライブラリの変更がプログラムに与える影響の大きさに応じて情報を整理しました。
    • Major changes は、広範囲のプログラムに影響を与える可能性のある変更(例: error 型の変更)を扱います。
    • Minor changes は、より限定的な影響を持つ変更や、go fix ツールで自動的に更新できる可能性のある変更(例: os.FileInfogo/* パッケージの変更)を扱います。 この分類は、ユーザーが自身のコードベースに影響する可能性のある変更を効率的に特定し、対応するための手助けとなります。
  4. go fix と手動更新の指示: 各変更点の説明には、Updating というサブセクションが設けられ、go fix ツールによる自動更新が可能か、または手動での更新が必要かどうかが明記されています。これは、Go 1への移行作業を行う開発者にとって非常に実用的な情報です。特に、go/* パッケージの変更のように、コンパイラがエラーを出すため手動での修正が必須となるケースが強調されています。

このコミットは、単なるドキュメントのレイアウト変更に留まらず、Go 1リリースにおけるAPIの安定化と、開発者への明確な移行ガイドライン提供という、より大きな目標を達成するための重要なステップでした。ドキュメントの構造を改善することで、Goチームは今後の変更をより効率的に管理し、ユーザーがGo 1の新しいエコシステムに適応するのを支援しようとしました。

関連リンク

  • Go 1 Release Notes (公式ドキュメント): https://go.dev/doc/go1 (このコミットが変更しているドキュメントの最終形)
  • Go Programming Language (公式ウェブサイト): https://go.dev/
  • Go Wiki - SliceTricks: https://go.dev/wiki/SliceTricks (コミット内で container/vector の代替として参照されている)

参考にした情報源リンク