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

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

このコミットは、Go言語の標準ライブラリにおけるパッケージ名の変更を反映した週次スナップショットの更新です。Go 1リリースに向けたAPIの安定化と整理の一環として行われたもので、doc/devel/weekly.html にパッケージ名の変更リストが追加され、.hgtags ファイルが更新されています。

コミット

  • コミットハッシュ: d83cc435e4c324e34aa10af72c1aa7f4fa47d4c1
  • Author: Andrew Gerrand adg@golang.org
  • Date: Wed Nov 9 10:57:09 2011 +1100
  • コミットメッセージ:
    weekly.2011-11-09
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5344055
    

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

https://github.com/golang/go/commit/d83cc435e4c324e34aa10af72c1aa7f4fa47d4c1

元コミット内容

weekly.2011-11-09

This weekly snapshot renames various Go packages as described in the Go 1 plan.
Import statements in client code can be updated automatically with gofix.

The changes are:
asn1              -> encoding/asn1
big               -> math/big
cmath             -> math/cmplx
csv               -> encoding/csv
exec              -> os/exec
exp/template/html -> html/template
gob               -> encoding/gob
http              -> net/http
http/cgi          -> net/http/cgi
http/fcgi         -> net/http/fcgi
http/httptest     -> net/http/httptest
http/pprof        -> net/http/pprof
json              -> encoding/json
mail              -> net/mail
rpc               -> net/rpc
rpc/jsonrpc       -> net/rpc/jsonrpc
scanner           -> text/scanner
smtp              -> net/smtp
syslog            -> log/syslog
tabwriter         -> text/tabwriter
template          -> text/template
template/parse    -> text/template/parse
rand              -> math/rand
url               -> net/url
utf16             -> unicode/utf16
utf8              -> unicode/utf8
xml               -> encoding/xml

変更の背景

このコミットは、Go言語のバージョン1(Go 1)リリースに向けた重要な準備段階の一部として行われました。Go 1は、言語仕様と標準ライブラリの安定化を目的としており、一度リリースされると後方互換性が厳密に維持されることが約束されました。そのため、リリース前に既存のパッケージ構造やAPIを整理し、将来にわたって持続可能な形にすることが不可欠でした。

特に、標準ライブラリ内のパッケージ名には一貫性と論理的な階層構造が求められました。例えば、エンコーディング関連のパッケージは encoding/ ディレクトリの下に、ネットワーク関連のパッケージは net/ ディレクトリの下に集約されるなど、より直感的で発見しやすい構造への変更が進められました。これにより、開発者がGoの標準ライブラリをより効率的に利用できるようになることが期待されました。

この大規模なパッケージ名の変更は、既存のGoコードベースに影響を与えるため、開発者の移行負担を軽減するためのツール gofix が提供されました。gofix は、古いパッケージ名を使用しているインポート文を自動的に新しい名前に書き換える機能を提供し、Go 1へのスムーズな移行を支援しました。

前提知識の解説

Go言語のパッケージシステム

Go言語は、コードのモジュール化と再利用を促進するためにパッケージシステムを採用しています。各Goプログラムは1つ以上のパッケージで構成され、関連する機能がまとめられています。パッケージはディレクトリ構造に対応しており、import ステートメントを使用して他のパッケージの機能を利用できます。例えば、import "fmt" は標準ライブラリの fmt パッケージをインポートし、fmt.Println() のようにその中の関数を呼び出すことができます。

Go 1の目標と安定性

Go 1は、Go言語の最初の安定版リリースであり、その最大の目標は「安定性」でした。Go 1以降、言語仕様と標準ライブラリのAPIは、特別な理由がない限り後方互換性を維持することが約束されました。これにより、Goで書かれたプログラムが将来のGoバージョンでも動作し続けることが保証され、Goエコシステムの成長と採用を促進しました。この安定化の過程で、既存のパッケージ構造やAPIに大規模な変更が加えられました。

gofix ツール

gofix は、Go言語のツールチェインに含まれるユーティリティで、Goのバージョンアップに伴うAPIの変更に既存のコードを自動的に適応させるために設計されました。特にGo 1への移行期には、パッケージ名の変更やAPIのシグネチャ変更など、手動で修正するには膨大な作業が必要となる変更が多数ありました。gofix はこれらの変更を検出し、Goのソースコードを解析して適切な修正を自動的に適用することで、開発者の移行コストを大幅に削減しました。

技術的詳細

このコミットで行われたパッケージ名の変更は、Go 1の標準ライブラリの再編成計画に基づいています。主な変更パターンは以下の通りです。

  1. サブパッケージへの移動: 多くのパッケージが、より一般的なカテゴリのサブパッケージとして移動されました。例えば、asn1, gob, json, xml といったエンコーディング関連のパッケージは encoding/ ディレクトリの下に、http, mail, rpc, url, smtp といったネットワーク関連のパッケージは net/ ディレクトリの下に、big, cmplx, rand といった数値計算関連のパッケージは math/ ディレクトリの下に、scanner, tabwriter, template, template/parse といったテキスト処理関連のパッケージは text/ ディレクトリの下に、utf16, utf8 といったUnicode関連のパッケージは unicode/ ディレクトリの下にそれぞれ移動されました。これにより、標準ライブラリの構造がより論理的で整理されたものになりました。
  2. exp/ パッケージの昇格: exp/template/html のように、実験的な (exp/) パッケージとして提供されていたものが、安定版の html/template として昇格されました。これは、その機能が十分に成熟し、標準ライブラリの一部として提供する準備が整ったことを意味します。
  3. os/execlog/syslog への移動: execsyslog のように、特定のOS機能やロギング機能に関連するパッケージが、それぞれ os/log/ のサブパッケージとして移動されました。

これらの変更は、Goの標準ライブラリのAPI設計における一貫性と予測可能性を高めることを目的としています。開発者は、特定の機能を探す際に、より適切なカテゴリの下を探すことができるようになります。

gofix ツールは、これらの変更を自動的に処理するために不可欠でした。gofix はGoの抽象構文木 (AST) を解析し、古いパッケージパスを新しいパスに置き換えるルールを適用します。これにより、手動での大規模なコード修正作業が不要となり、Go 1への移行が容易になりました。

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

このコミットでは、主に以下の2つのファイルが変更されています。

  1. .hgtags
    • f4397ad6e87c7ce5feac9b01686f1ebd6cbaac4e weekly の行が削除されています。これは、週次スナップショットのタグ付け方法に関する変更の一部である可能性があります。
  2. doc/devel/weekly.html
    • このファイルは、Goの週次スナップショットに関する開発者向けドキュメントです。
    • <h2 id="2011-11-08">2011-11-09</h2> という新しいセクションが追加され、その下に今回のコミットで変更されたパッケージ名のマッピングリストが pre タグ内に記述されています。
      • 例: asn1 -> encoding/asn1
    • 既存の 2011-11-08 セクションのXML関連の記述が * xml: allow parsing of <_> </_>. (thanks David Crawshaw). から * xml: allow parsing of &lt;_&gt; &lt;/_&gt;. (thanks David Crawshaw). に変更されています。これはHTMLエンティティへの修正です。

コアとなるコードの解説

.hgtags の変更

.hgtags ファイルは、Mercurialリポジトリにおけるタグの情報を記録するファイルです。このファイルから weekly タグのエントリが削除されたのは、おそらく週次スナップショットのタグ付け戦略が変更されたためと考えられます。Goプロジェクトは当初Mercurialを使用しており、後にGitに移行しました。この変更は、その移行期またはタグ付けプロセスの改善の一環として行われた可能性があります。

doc/devel/weekly.html の変更

doc/devel/weekly.html は、Goの開発者が週次スナップショットの変更内容を把握するための重要なドキュメントです。このファイルにパッケージ名の変更リストが追加されたことは、以下の点を意味します。

  • 変更の公式な告知: このリストは、Go 1リリースに向けて行われた大規模なパッケージ再編成を開発者に公式に通知するものです。これにより、開発者は自分のコードベースでどの import パスを更新する必要があるかを明確に把握できます。
  • gofix の利用促進: コミットメッセージにもあるように、「Import statements in client code can be updated automatically with gofix.」と明記することで、gofix ツールの利用を促しています。これは、手動での修正作業の負担を軽減し、Go 1へのスムーズな移行を支援するための重要な情報です。
  • 歴史的記録: このドキュメントは、Go言語の進化の過程における重要なマイルストーンを記録する役割も果たしています。将来のGo開発者が、なぜ特定のパッケージ名が変更されたのか、その背景を理解するのに役立ちます。

XML関連のHTMLエンティティの修正は、ドキュメントの正確性と表示品質を向上させるための軽微な修正です。

関連リンク

参考にした情報源リンク