[インデックス 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
と同様に動作しますが、ロケーション(タイムゾーン)のコンテキストで時刻を解析し、解析された文字列内のタイムゾーン情報を無視します。これは、time
APIにおける一般的な混乱の原因に対処するためのものです。
- 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/go
command documentation:go
コマンドに関する公式ドキュメント。 - Go
cmd/fix
command documentation:go fix
コマンドに関する公式ドキュメント。 - Go
debug/elf
package documentation:debug/elf
パッケージに関する公式ドキュメント。 - Go
net
package documentation:net
パッケージに関する公式ドキュメント。 - Go
time
package documentation:time
パッケージに関する公式ドキュメント。 - Go
go.exp
repository: 実験的なGoパッケージのリポジトリ。 - Go
go.text
repository: Unicodeおよびテキスト関連パッケージのリポジトリ。
参考にした情報源リンク
- Go 1.1 Release Notes (公式ドキュメント): このコミットによって更新されたドキュメントそのもの。
- Go言語の公式GitHubリポジトリ: コミット履歴とソースコード。
- Go言語の公式ブログやアナウンス: Go 1.1リリース時の公式発表。
- Go言語のIssueトラッカー: 各変更の背景にある議論やバグ報告。
- Go言語のコードレビューシステム (Gerrit): コミット
7914043
の詳細なレビュー履歴。