[インデックス 12044] ファイルの概要
このコミットは、Go言語のバージョン1(Go 1)のリリースノートまたはドキュメント(doc/go1.html
とdoc/go1.tmpl
)に対して行われた更新です。具体的には、os
パッケージにおけるエラー処理の変更点に関する記述を追加し、以前に記述した内容が失われたため再追加されたものです。
コミット
commit c3ef1980209ff152dec97203bb987d2d74a79bba
Author: Rob Pike <r@golang.org>
Date: Sun Feb 19 14:15:26 2012 +1100
go 1: add a description of the os error changes.
I'm sure I wrote these before but they've disappeared.
R=golang-dev, bradfitz, r
CC=golang-dev
https://golang.org/cl/5673100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c3ef1980209ff152dec97203bb987d2d74a79bba
元コミット内容
このコミットは、Go 1のリリースドキュメントに、os
パッケージの変更点、特にエラー処理に関する記述を追加するものです。コミットメッセージには「go 1: add a description of the os error changes. I'm sure I wrote these before but they've disappeared.」とあり、以前に書かれた内容が何らかの理由で失われたため、再度追加されたことが示唆されています。
変更の背景
Go言語は、その設計思想として「シンプルさ」と「堅牢性」を重視しています。Go 1のリリースは、言語仕様と標準ライブラリの安定化を目的とした重要なマイルストーンでした。この安定化の過程で、異なるオペレーティングシステム(OS)間での互換性や移植性を高めるために、os
パッケージのエラー処理メカニズムが見直されました。
従来のos
パッケージでは、EINVAL
のようなOS固有のエラー定数が直接公開されていました。しかし、これらの定数の値や存在はOSによって異なり、Goプログラムの移植性を損なう可能性がありました。この問題を解決するため、Go 1ではOS固有のエラー定数を直接使用するのではなく、より抽象的でポータブルなエラーテスト関数(例: os.IsPermission
)や、Goらしい名前を持つ新しいエラー値(例: os.ErrPermission
)を導入する変更が行われました。
このコミットは、これらの重要な変更がGo 1の公式ドキュメントに適切に反映されるようにするためのものです。ドキュメントの正確性は、開発者が新しいGo 1のAPIにスムーズに移行し、正しいエラー処理を実装するために不可欠です。
前提知識の解説
Go言語のエラーハンドリング
Go言語では、エラーは戻り値として明示的に扱われます。関数は通常、最後の戻り値としてerror
型の値を返します。nil
はエラーがないことを意味し、非nil
の値はエラーが発生したことを示します。
func doSomething() (resultType, error) {
// ... 処理 ...
if someCondition {
return zeroValue, errors.New("something went wrong")
}
return actualResult, nil
}
Go 1以前のos
パッケージでは、syscall
パッケージからインポートされたErrno
型(Unix系OSのerrno
に相当)や、EINVAL
のようなOS固有のエラー定数が直接使用されることがありました。これは、低レベルのシステムコールエラーを直接扱う際には便利でしたが、異なるOS間でのコードの移植性を低下させる要因となっていました。
uintptr
とint
uintptr
は、ポインタを保持するのに十分な大きさの符号なし整数型です。これは、GoのポインタとC言語のポインタの間で変換を行う際や、システムコールでファイルディスクリプタのようなOSリソースを扱う際に使用されます。
int
は、Goの基本的な整数型であり、通常はプラットフォームのネイティブなワードサイズ(32ビットまたは64ビット)に依存します。
ファイルディスクリプタ(File Descriptor, FD)は、Unix系OSにおいてファイルやソケットなどのI/Oリソースを識別するためにカーネルが割り当てる整数値です。Go 1では、os
パッケージがファイルディスクリプタを扱う際に、より汎用的なuintptr
型を使用するように変更されました。これは、異なるOSアーキテクチャ間での互換性を高めるための一環と考えられます。
技術的詳細
このコミットでドキュメントに追加されたos
パッケージの変更点は以下の通りです。
-
os.Time
関数の削除:- Go 1では、
os
パッケージからTime
関数が削除されました。 - 代わりに、
time
パッケージのtime.Time
型を使用することが推奨されます。これは、時間に関する操作を一元的にtime
パッケージに集約し、APIの整合性を高めるための変更です。
- Go 1では、
-
os.Exec
関数の削除:os
パッケージからExec
関数が削除されました。- 代わりに、利用可能な場合は
syscall
パッケージのExec
関数を使用するように変更されました。これは、低レベルのプロセス実行に関する機能がsyscall
パッケージに移動されたことを意味します。
-
os.ShellExpand
からos.ExpandEnv
へのリネーム:- 環境変数を展開する関数
ShellExpand
がExpandEnv
にリネームされました。 - この変更は、関数の目的をより明確にし、Goの命名規則に合わせるためのものです。
- 環境変数を展開する関数
-
os.NewFile
とos.File.Fd
の型変更:os.NewFile
関数は、ファイルディスクリプタの引数としてint
ではなくuintptr
を受け取るようになりました。os.File
型のFd
メソッドも、uintptr
を返すようになりました。- この変更は、ファイルディスクリプタの型をより汎用的な
uintptr
に統一することで、異なるOS間での互換性を向上させることを目的としています。
-
os
パッケージからのエラー定数の削除と新しいエラー処理の導入:- 最も重要な変更点の一つは、
os
パッケージからEINVAL
のようなOS固有のエラー定数が削除されたことです。これらの定数は、基盤となるOSによって値が異なり、移植性の問題を引き起こしていました。 - 代わりに、一般的なエラープロパティをテストするためのポータブルな関数(例:
os.IsPermission
)が導入されました。これにより、開発者はOSに依存しない形でエラーの種類を判別できるようになります。 - さらに、
os.ErrPermission
やos.ErrNoEnv
といった、よりGoらしい名前を持つ新しいエラー値が導入されました。これらは、特定のエラー条件を示すための標準的なエラーインスタンスとして機能します。
- 最も重要な変更点の一つは、
これらの変更は、Go 1が目指す「安定性」と「移植性」を達成するために不可欠なものでした。特にエラー処理の変更は、Goプログラムが様々な環境で一貫して動作することを保証する上で重要な役割を果たします。
コアとなるコードの変更箇所
このコミットは、Go 1のドキュメントファイルであるdoc/go1.html
とdoc/go1.tmpl
に対する変更です。具体的な変更は、os
パッケージに関するセクションに集中しています。
--- a/doc/go1.html
+++ b/doc/go1.html
@@ -1418,24 +1418,44 @@
<h3 id=\"os\">The os package</h3>
-<p>The <code>Time</code> function has been removed; callers should use
+<p>
+The <code>Time</code> function has been removed; callers should use
the <a href=\"/pkg/time/#Time\"><code>Time</code></a> type from the
-<code>time</code> package.</p>
+<code>time</code> package.
+</p>
-<p>The <code>Exec</code> function has been removed; callers should use
-<code>Exec</code> from the <code>syscall</code> package, where available.</p>
+<p>
+The <code>Exec</code> function has been removed; callers should use
+<code>Exec</code> from the <code>syscall</code> package, where available.
+</p>
-<p>The <code>ShellExpand</code> function has been renamed to <a
-href=\"/pkg/os/#ExpandEnv\"><code>ExpandEnv</code></a>.</p>
+<p>
+The <code>ShellExpand</code> function has been renamed to <a
+href=\"/pkg/os/#ExpandEnv\"><code>ExpandEnv</code></a>.
+</p>
-<p>The <a href=\"/pkg/os/#NewFile\"><code>NewFile</code></a> function
+<p>
+The <a href=\"/pkg/os/#NewFile\"><code>NewFile</code></a> function
now takes a <code>uintptr</code> fd, instead of an <code>int</code>.\n The <a href=\"/pkg/os/#File.Fd\"><code>Fd</code></a> method on files now\n-also returns a <code>uintptr</code>.</p>
+also returns a <code>uintptr</code>.
+</p>
+\n+<p>
+There are no longer error constants such as <code>EINVAL</code>
+in the <code>os</code> package, since the set of values varied with
+the underlying operating system. There are new portable functions like
+<a href=\"/pkg/os/#IsPermission\"><code>IsPermission</code></a>
+to test common error properties, plus a few new error values
+with more Go-like names, such as
+<a href=\"/pkg/os/#ErrPermission\"><code>ErrPermission</code></a>
+and
+<a href=\"/pkg/os/#ErrNoEnv\"><code>ErrNoEnv</code></a>.
+\n
<p>
<em>Updating</em>:\n-What little code is affected will be caught by the compiler and must be updated by hand.\n+Affected code will be caught by the compiler and must be updated by hand.\n </p>
同様の変更がdoc/go1.tmpl
にも適用されています。
コアとなるコードの解説
上記の差分は、Go 1のドキュメントにos
パッケージの変更点を記述するHTMLコンテンツを追加・修正している部分です。
-
os.Time
、os.Exec
、os.ShellExpand
に関する記述:- これらの関数が削除またはリネームされたこと、そして代替となる関数やパッケージが示されています。これは、APIの整理と一貫性の向上を目的とした変更です。
-
os.NewFile
とos.File.Fd
の型変更に関する記述:- ファイルディスクリプタの型が
int
からuintptr
に変更されたことが明記されています。これにより、開発者は新しいAPIのシグネチャに合わせてコードを更新する必要があることを理解できます。
- ファイルディスクリプタの型が
-
エラー定数の削除と新しいエラー処理に関する記述(最も重要な追加):
- このコミットの主要な目的である、
os
パッケージからのOS固有のエラー定数(例:EINVAL
)の削除と、新しいポータブルなエラーテスト関数(os.IsPermission
など)およびGoらしいエラー値(os.ErrPermission
、os.ErrNoEnv
など)の導入が詳細に説明されています。 - この変更は、Goプログラムの移植性と堅牢性を大幅に向上させるためのものであり、開発者にとってはエラー処理のベストプラクティスを理解する上で非常に重要な情報です。
- このコミットの主要な目的である、
-
更新に関する注意書き:
- 「Affected code will be caught by the compiler and must be updated by hand.」という記述は、これらのAPI変更がコンパイルエラーを引き起こすため、開発者が手動でコードを修正する必要があることを明確に伝えています。これは、
go fix
ツールでは自動的に修正できないような、より根本的なAPIの変更であることを示唆しています。
- 「Affected code will be caught by the compiler and must be updated by hand.」という記述は、これらのAPI変更がコンパイルエラーを引き起こすため、開発者が手動でコードを修正する必要があることを明確に伝えています。これは、
これらのドキュメントの更新は、Go 1のリリースにおけるos
パッケージの重要な変更点を開発者に正確に伝え、スムーズな移行を支援するために不可欠な役割を果たします。
関連リンク
- Go 1 Release Notes (公式ドキュメント): Go 1のリリース時に公開された公式の変更点や新機能に関する情報が含まれています。このコミットが更新しているドキュメントの一部です。
- https://go.dev/doc/go1 (現在のGo 1ドキュメントのURL)
- Go
os
package documentation:os
パッケージの現在のAPIリファレンス。 - Go
time
package documentation:time
パッケージの現在のAPIリファレンス。 - Go
syscall
package documentation:syscall
パッケージの現在のAPIリファレンス。
参考にした情報源リンク
- Go 1 Release Notes (特に "The os package" セクション):
- Go
os
package documentation: - Go
time
package documentation: - Go
syscall
package documentation: - Go言語のエラーハンドリングに関する一般的な情報源 (例: Go公式ブログのエラーに関する記事など)
- ファイルディスクリプタと
uintptr
に関する一般的なプログラミング知識。 - Go言語のコミット履歴とGerrit Change-IDの仕組みに関する情報。
- https://go.dev/doc/contribute (Goへの貢献ガイド)
- https://go-review.googlesource.com/c/go/+/5673100 (Gerrit上の元の変更リスト)