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

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

このコミットは、Go言語のバージョン1(Go 1)のリリースノートまたはドキュメント(doc/go1.htmldoc/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間でのコードの移植性を低下させる要因となっていました。

uintptrint

uintptrは、ポインタを保持するのに十分な大きさの符号なし整数型です。これは、GoのポインタとC言語のポインタの間で変換を行う際や、システムコールでファイルディスクリプタのようなOSリソースを扱う際に使用されます。 intは、Goの基本的な整数型であり、通常はプラットフォームのネイティブなワードサイズ(32ビットまたは64ビット)に依存します。

ファイルディスクリプタ(File Descriptor, FD)は、Unix系OSにおいてファイルやソケットなどのI/Oリソースを識別するためにカーネルが割り当てる整数値です。Go 1では、osパッケージがファイルディスクリプタを扱う際に、より汎用的なuintptr型を使用するように変更されました。これは、異なるOSアーキテクチャ間での互換性を高めるための一環と考えられます。

技術的詳細

このコミットでドキュメントに追加されたosパッケージの変更点は以下の通りです。

  1. os.Time関数の削除:

    • Go 1では、osパッケージからTime関数が削除されました。
    • 代わりに、timeパッケージのtime.Time型を使用することが推奨されます。これは、時間に関する操作を一元的にtimeパッケージに集約し、APIの整合性を高めるための変更です。
  2. os.Exec関数の削除:

    • osパッケージからExec関数が削除されました。
    • 代わりに、利用可能な場合はsyscallパッケージのExec関数を使用するように変更されました。これは、低レベルのプロセス実行に関する機能がsyscallパッケージに移動されたことを意味します。
  3. os.ShellExpandからos.ExpandEnvへのリネーム:

    • 環境変数を展開する関数ShellExpandExpandEnvにリネームされました。
    • この変更は、関数の目的をより明確にし、Goの命名規則に合わせるためのものです。
  4. os.NewFileos.File.Fdの型変更:

    • os.NewFile関数は、ファイルディスクリプタの引数としてintではなくuintptrを受け取るようになりました。
    • os.File型のFdメソッドも、uintptrを返すようになりました。
    • この変更は、ファイルディスクリプタの型をより汎用的なuintptrに統一することで、異なるOS間での互換性を向上させることを目的としています。
  5. osパッケージからのエラー定数の削除と新しいエラー処理の導入:

    • 最も重要な変更点の一つは、osパッケージからEINVALのようなOS固有のエラー定数が削除されたことです。これらの定数は、基盤となるOSによって値が異なり、移植性の問題を引き起こしていました。
    • 代わりに、一般的なエラープロパティをテストするためのポータブルな関数(例: os.IsPermission)が導入されました。これにより、開発者はOSに依存しない形でエラーの種類を判別できるようになります。
    • さらに、os.ErrPermissionos.ErrNoEnvといった、よりGoらしい名前を持つ新しいエラー値が導入されました。これらは、特定のエラー条件を示すための標準的なエラーインスタンスとして機能します。

これらの変更は、Go 1が目指す「安定性」と「移植性」を達成するために不可欠なものでした。特にエラー処理の変更は、Goプログラムが様々な環境で一貫して動作することを保証する上で重要な役割を果たします。

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

このコミットは、Go 1のドキュメントファイルであるdoc/go1.htmldoc/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.Timeos.Execos.ShellExpandに関する記述:

    • これらの関数が削除またはリネームされたこと、そして代替となる関数やパッケージが示されています。これは、APIの整理と一貫性の向上を目的とした変更です。
  • os.NewFileos.File.Fdの型変更に関する記述:

    • ファイルディスクリプタの型がintからuintptrに変更されたことが明記されています。これにより、開発者は新しいAPIのシグネチャに合わせてコードを更新する必要があることを理解できます。
  • エラー定数の削除と新しいエラー処理に関する記述(最も重要な追加):

    • このコミットの主要な目的である、osパッケージからのOS固有のエラー定数(例: EINVAL)の削除と、新しいポータブルなエラーテスト関数(os.IsPermissionなど)およびGoらしいエラー値(os.ErrPermissionos.ErrNoEnvなど)の導入が詳細に説明されています。
    • この変更は、Goプログラムの移植性と堅牢性を大幅に向上させるためのものであり、開発者にとってはエラー処理のベストプラクティスを理解する上で非常に重要な情報です。
  • 更新に関する注意書き:

    • 「Affected code will be caught by the compiler and must be updated by hand.」という記述は、これらのAPI変更がコンパイルエラーを引き起こすため、開発者が手動でコードを修正する必要があることを明確に伝えています。これは、go fixツールでは自動的に修正できないような、より根本的なAPIの変更であることを示唆しています。

これらのドキュメントの更新は、Go 1のリリースにおけるosパッケージの重要な変更点を開発者に正確に伝え、スムーズな移行を支援するために不可欠な役割を果たします。

関連リンク

  • Go 1 Release Notes (公式ドキュメント): Go 1のリリース時に公開された公式の変更点や新機能に関する情報が含まれています。このコミットが更新しているドキュメントの一部です。
  • Go os package documentation: osパッケージの現在のAPIリファレンス。
  • Go time package documentation: timeパッケージの現在のAPIリファレンス。
  • Go syscall package documentation: syscallパッケージの現在のAPIリファレンス。

参考にした情報源リンク