[インデックス 15844] ファイルの概要
このコミットは、Go言語のバージョン1.1のリリースノートドキュメントである doc/go1.1.html ファイルに対する更新です。具体的には、既存のテキストにリンクを追加し、Go 1.1で導入された言語、実装、ツール、および標準ライブラリの変更点に関する新しいセクションを書き加えています。
コミット
commit ee5a794fbbde0bc608f91e974a9b12f887b8266c
Author: Rob Pike <r@golang.org>
Date: Tue Mar 19 16:40:19 2013 -0700
doc/go1.1.html: add links to the text, write some new sections
R=golang-dev, rsc, dave
CC=golang-dev
https://golang.org/cl/7914043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ee5a794fbbde0bc608f91e974a9b12f887b8266c
元コミット内容
doc/go1.1.html ファイルが変更され、156行が追加され、48行が削除されました。この変更は、Go 1.1のリリースノートに、言語の変更点、実装とツールの変更点、および標準ライブラリの変更点に関する詳細な説明と内部リンクを追加することを目的としています。
変更の背景
このコミットの背景には、Go 1.1のリリースが控えており、その新機能や変更点をユーザーに正確かつ包括的に伝える必要があったことが挙げられます。Go 1.1は、Go 1のリリース後初のメジャーアップデートであり、言語仕様の厳密化、パフォーマンスの向上、ツールの改善、標準ライブラリの機能拡張など、多岐にわたる変更が含まれていました。これらの変更点を網羅した公式ドキュメントは、開発者がGo 1.1へスムーズに移行し、新機能を活用するために不可欠です。
特に、Go言語は「Go 1互換性ドキュメント」でGo 1言語仕様で書かれたプログラムが引き続き動作することを約束しており、このコミットは、その約束を維持しつつ、仕様の厳密化や新しい言語機能に関する詳細を明確に伝える役割を担っています。
前提知識の解説
このコミット内容を理解するためには、以下のGo言語に関する基本的な知識が前提となります。
- Go言語のバージョン管理と互換性: Go言語はGo 1以降、後方互換性を非常に重視しています。Go 1.1はGo 1の互換性保証を維持しつつ、機能追加や改善が行われました。
- Goのツールチェイン:
go build,go get,go fixなど、Go言語の開発をサポートするコマンドラインツール群の基本的な役割。 - Goの標準ライブラリ:
net,time,debug/elfなど、Go言語に標準で提供されるパッケージの基本的な機能。 - Goの型システム:
int,uintなどの整数型、およびそれらのプラットフォーム依存のサイズに関する知識。 - Unicodeとサロゲートペア: Unicode文字エンコーディング、特にUTF-16におけるサロゲートペアの概念。
- ELF (Executable and Linkable Format): Unix系システムで実行可能ファイル、オブジェクトファイル、共有ライブラリなどに用いられるファイル形式。
debug/elfパッケージはこれを扱うためのものです。 GOROOTとGOPATH: Goのワークスペースを構成する重要な環境変数。GOROOTはGoのインストールディレクトリを指し、GOPATHはユーザーのGoプロジェクトのワークスペースを指します。
技術的詳細
このコミットによって doc/go1.1.html に追加された主な技術的変更点と解説は以下の通りです。
-
言語の変更点:
- 定数ゼロによる整数除算: Go 1.1では、定数ゼロによる整数除算はコンパイル時エラーとなるように明確化されました。Go 1.0では実行時パニックを引き起こす可能性がありました。
- Unicodeリテラルにおけるサロゲート: 文字列リテラルおよびruneリテラルの定義が厳密化され、有効なUnicodeコードポイントのセットからサロゲートペアが除外されました。これは、UTF-16エンコーディングにおけるサロゲートペアが、Goのrune(Unicodeコードポイントを表す)としては不正な値であるという仕様の明確化です。
- メソッド値: メソッド値に関するセクションが追加されました。これは、Go 1.1で導入された、メソッドを関数値として扱う機能に関する説明です。
return要件:returnステートメントの要件に関するセクションが追加されました。
-
実装とツールの変更点:
- 64ビットプラットフォームにおける
intのサイズ:gcおよびgccgoコンパイラにおいて、64ビットプラットフォーム(AMD64/x86-64など)でintおよびuint型が64ビット幅になるように変更されました。これにより、64ビットシステム上で20億以上の要素を持つスライスを割り当てることが可能になりました。この変更は、32ビットシステムと64ビットシステム間での移植性に関する考慮事項を伴います。 gcアセンブラ:int型のサイズ変更やその他の変更により、gcツールチェインにおけるスタック上の関数引数の配置が変更されました。アセンブリで書かれた関数は、フレームポインタのオフセットを調整する必要があることが明記されました。goコマンドの変更:- パッケージが見つからない場合に、検索されたパスのリストを含むより詳細なエラーメッセージが表示されるようになりました。
go getコマンドが、パッケージソースのダウンロード先としてGOROOTをデフォルトで許可しなくなりました。go getを使用するには、有効なGOPATHが必須となりました。GOPATHとGOROOTが同じ値に設定されている場合、go getコマンドが失敗するようになりました。これは、ユーザーが誤ってGoのインストールディレクトリに直接パッケージをダウンロードしてしまうことを防ぐための変更です。
go fixの変更:go fixコマンドが、Go 1以前のコードをGo 1 APIに更新するための修正を適用しなくなりました。Go 1.1に更新するには、まずGo 1.0ツールチェインを使用してコードをGo 1.0に変換する必要があることが示されました。
- 64ビットプラットフォームにおける
-
標準ライブラリの変更点:
debug/elf:debug/elfパッケージが、ELFシンボルテーブルの最初のシンボル(常に空のシンボル)をスキップしなくなりました。これにより、debug/elfが返すシンボルテーブルのインデックスが、元のELFシンボルテーブルのインデックスと異なる可能性があるため、SymbolsやImportedSymbols関数を呼び出すコードは調整が必要になる場合があります。net:netパッケージのプロトコル固有のリゾルバ(ResolveTCPAddrなど)が、ネットワーク名に厳密なチェックを行うようになりました。以前は任意の文字列を受け入れていましたが、Go 1.1ではtcp,tcp4,tcp6などの有効な文字列でない場合はエラーを返します。ListenUnixgramの以前の実装がUDPConnを返していたのに対し、Go 1.1ではUnixConnを返すようになりました。これにより、UnixConnのReadFromおよびWriteToメソッドを使用して読み書きが可能になります。
time:- FreeBSD, Linux, NetBSD, OS X, OpenBSDなどのシステムで、
timeパッケージがマイクロ秒精度からナノ秒精度で時刻を返すようになりました。これにより、外部ストレージにマイクロ秒精度で時刻を保存し、読み戻す際に元の時刻が正確に復元されない可能性があるため、time.Timeの新しいメソッドRoundとTruncateを使用して精度を調整する必要があることが示されました。 - 新しいメソッド
YearDayが追加され、時刻値が指定する年の1から始まる日番号を返します。 Timer型に新しいメソッドResetが追加され、タイマーが指定された期間後に期限切れになるように変更できるようになりました。- 新しい関数
ParseInLocationが追加され、既存のParseと同様に動作しますが、ロケーション(タイムゾーン)のコンテキストで時刻を解析し、解析された文字列内のタイムゾーン情報を無視します。これは、timeAPIにおける一般的な混乱の原因に対処するためのものです。
- FreeBSD, Linux, NetBSD, OS X, OpenBSDなどのシステムで、
-
expおよびoldサブツリーの移動:expサブツリーがcode.google.com/p/go.expサブリポジトリに移動しました。これにより、バイナリディストリビューションがこれらの実験的なパッケージにアクセスしやすくなりました。- 古いパッケージ
exp/normもgo.textという新しいリポジトリに移動しました。このgo.textリポジトリは、Unicode APIやその他のテキスト関連パッケージが開発される場所となります。
これらの変更は、Go 1.1がGo言語の成熟度を高め、より堅牢で使いやすいプラットフォームにするための重要なステップであったことを示しています。
コアとなるコードの変更箇所
このコミットは、Go言語のソースコード自体ではなく、Go 1.1のリリースノートドキュメントである doc/go1.1.html ファイルの変更に限定されています。したがって、「コアとなるコード」とは、このHTMLドキュメントのコンテンツそのものを指します。
変更の主な箇所は以下の通りです。
- HTML構造の追加: 新しい
h3タグで始まるセクション(例:id="unicode_literals",id="method_values",id="return")が追加され、Go 1.1の言語変更点に関する説明の枠組みが作られました。 - 既存セクションの拡張と詳細化:
id="language"セクションに、Go 1互換性ドキュメントへのリンクと、言語仕様の厳密化に関する説明が追加されました。id="int"セクション(64ビットプラットフォームでのintサイズ)に、より詳細な説明とコード例が追加されました。id="unicode_surrogates"がid="unicode"に変更され、Unicodeに関する説明が拡充されました。id="asm"がid="gc_asm"に変更され、gcアセンブラに関する説明が詳細化されました。id="gotool"がid="gocmd"に変更され、goコマンドの変更点(パッケージ検索エラーメッセージ、go getのGOPATH必須化、GOPATHとGOROOTの同一設定の禁止)が詳細に記述されました。id="gofix"セクションにgo fixコマンドの変更点が追加されました。id="debug_elf",id="net",id="time"といった標準ライブラリのセクションが大幅に加筆修正され、Go 1.1でのAPI変更や振る舞いの変更が詳細に説明されました。id="exp_old"セクションがid="exp_old"からid="exp_old"に変更され、go.expおよびgo.textサブリポジトリへの移動に関する説明が追加されました。
- 内部リンクの追加: ドキュメント内の関連セクションへの
<a>タグによる内部リンクが多数追加され、読者が関連情報を参照しやすくなりました。
これらの変更は、Go 1.1のリリースノートをより網羅的で理解しやすいものにするための、純粋なドキュメントの更新です。
コアとなるコードの解説
このコミットにおける「コアとなるコード」は、Go 1.1のリリースノートを記述したHTMLファイル doc/go1.1.html です。このファイルは、Go言語の公式ドキュメントの一部として、Go 1.1で導入された主要な変更点、新機能、および既存の振る舞いの修正について、開発者向けに情報を提供します。
具体的な変更内容の解説は以下の通りです。
- HTML構造の改善とコンテンツの追加:
- 以前は
TODOとなっていた箇所に、具体的なコンテンツが追加されました。例えば、言語の変更点に関するセクションでは、Go 1互換性ドキュメントへのリンクが追加され、Go 1.1での仕様の厳密化について言及されています。 <h3>タグで新しいサブセクションが多数追加されました。これには、「Surrogates in Unicode literals」(Unicodeリテラルにおけるサロゲート)、「Method values」(メソッド値)、「Return requirements」(return要件)など、Go 1.1で導入された言語機能や仕様の明確化に関する項目が含まれます。
- 以前は
- 既存コンテンツの拡充と詳細化:
int型のサイズ変更に関するセクションでは、32ビットシステムと64ビットシステムでのintの振る舞いの違いについて、より詳細な説明とコード例が追加されました。これにより、開発者が移植性の問題を理解しやすくなっています。goコマンドの変更点については、パッケージが見つからない場合のエラーメッセージの改善、go getがGOPATHを必須とするようになったこと、GOPATHとGOROOTが同じ値に設定されている場合の挙動など、具体的な変更が詳細に記述されています。これにより、新しいGoユーザーが直面する可能性のある一般的な問題が明確化されています。- 標準ライブラリの変更点、特に
netパッケージとtimeパッケージについては、APIの振る舞いの変更や新しいメソッド・関数の追加が詳細に説明されています。例えば、timeパッケージのナノ秒精度への変更と、それに対応するためのRoundおよびTruncateメソッドの導入は、開発者が既存のコードを更新する際に重要な情報となります。
- 内部リンクの活用:
- ドキュメント内で関連するGoのパッケージドキュメント(例:
/pkg/net/,/pkg/time/)や、特定の関数・メソッドのドキュメント(例:/pkg/net/#ResolveTCPAddr)へのリンクが多数追加されました。これにより、読者はリリースノートから直接、詳細なAPIドキュメントにアクセスできるようになり、情報の探索性が向上しています。 - GoのIssueトラッカーへのリンク(例:
http://golang.org/issue/2188)も追加されており、特定の変更の背景にある議論や決定プロセスを追跡できるようになっています。
- ドキュメント内で関連するGoのパッケージドキュメント(例:
このコミットは、Go 1.1のリリースノートを単なる変更点のリストではなく、Go 1.1の全体像と各変更の技術的詳細を深く掘り下げた、包括的なリファレンスドキュメントへと昇華させることを目的としています。これにより、Go開発者はGo 1.1への移行をよりスムーズに行い、新機能を最大限に活用できるようになります。
関連リンク
- Go 1.1 Release Notes (公式ドキュメント): このコミットによって更新されたドキュメントの最終版。
- https://go.dev/doc/go1.1 (現在のGo公式ドキュメント)
- Go 1 Compatibility Document: Go 1以降の互換性保証に関する公式ドキュメント。
- Go Issue 2188:
intとuintのサイズに関する議論。 - Go
cmd/gocommand documentation:goコマンドに関する公式ドキュメント。 - Go
cmd/fixcommand documentation:go fixコマンドに関する公式ドキュメント。 - Go
debug/elfpackage documentation:debug/elfパッケージに関する公式ドキュメント。 - Go
netpackage documentation:netパッケージに関する公式ドキュメント。 - Go
timepackage documentation:timeパッケージに関する公式ドキュメント。 - Go
go.exprepository: 実験的なGoパッケージのリポジトリ。 - Go
go.textrepository: Unicodeおよびテキスト関連パッケージのリポジトリ。
参考にした情報源リンク
- Go 1.1 Release Notes (公式ドキュメント): このコミットによって更新されたドキュメントそのもの。
- Go言語の公式GitHubリポジトリ: コミット履歴とソースコード。
- Go言語の公式ブログやアナウンス: Go 1.1リリース時の公式発表。
- Go言語のIssueトラッカー: 各変更の背景にある議論やバグ報告。
- Go言語のコードレビューシステム (Gerrit): コミット
7914043の詳細なレビュー履歴。