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

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

このコミットは、Go 1リリースに関するドキュメント(doc/go1.html および doc/go1.tmpl)から、*os.FileStat への古い参照を削除するものです。これは、Go 1における os.FileInfo インターフェースの実装に関する変更を反映しています。

コミット

  • コミットハッシュ: 6ba77ecb6ac2c3dcfee089c6c3e65c6fdc5f69ae
  • Author: Rob Pike r@golang.org
  • Date: Tue Feb 21 08:03:03 2012 +1100

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

https://github.com/golang/go/commit/6ba77ecb6ac2c3dcfee089c6c3e65c6fdc5f69ae

元コミット内容

    doc/go1: delete obsolete reference to FileStat
    Fixes #3013.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5683049

変更の背景

この変更は、Go言語のバージョン1(Go 1)のリリースに伴うAPIの変更を反映したものです。特に、ファイルシステムに関する情報を提供する os パッケージ内の FileInfo インターフェースの扱いが変更されました。

Go 1の設計目標の一つに、APIの安定化と簡素化がありました。以前のGoのバージョンでは、os.FileInfo インターフェースの実装として *os.FileStat という具体的な型がドキュメントなどで言及されることがありました。しかし、FileInfo はあくまでインターフェースであり、その具体的な実装はオペレーティングシステム(OS)に依存します。*os.FileStat という具体的な型への言及は、OS固有の実装の詳細を抽象化するという FileInfo インターフェースの目的と矛盾する可能性がありました。

このコミットは、Fixes #3013 と関連付けられています。GoのIssue #3013は、「doc/go1: os.FileStat is not exported」というタイトルで、os.FileStat がエクスポートされていない(つまり、外部から直接アクセスできない)にもかかわらず、ドキュメントで言及されていることの矛盾を指摘しています。このコミットは、この矛盾を解消し、FileInfo インターフェースの抽象性をより明確にするために、ドキュメントから *os.FileStat への直接的な参照を削除しました。

前提知識の解説

Go言語の os パッケージ

Go言語の os パッケージは、オペレーティングシステムと対話するための機能を提供します。これには、ファイル操作、プロセス管理、環境変数へのアクセスなどが含まれます。

os.FileInfo インターフェース

os.FileInfo は、ファイルに関する情報(ファイル名、サイズ、パーミッション、最終更新時刻など)を抽象的に表現するためのインターフェースです。このインターフェースは、異なるファイルシステムやオペレーティングシステム間で一貫した方法でファイル情報を扱うことを可能にします。

FileInfo インターフェースの定義は以下のようになっています(Go 1時点での概念):

type FileInfo interface {
    Name() string       // base name of the file
    Size() int64        // length in bytes
    Mode() FileMode     // file mode bits
    ModTime() time.Time // modification time
    IsDir() bool        // abbreviation for Mode().IsDir()
    Sys() interface{}   // underlying data source (can return nil)
}

Sys() メソッド

FileInfo インターフェースの Sys() メソッドは、基となるデータソース(通常はOS固有のファイルシステム情報)を interface{} 型で返します。これにより、ユーザーは必要に応じて、OS固有のファイル情報(例えばUnixにおけるi-node番号など)にアクセスできます。ただし、Sys() が返す具体的な型はOSによって異なり、またエクスポートされていない(パッケージ外部から直接参照できない)場合もあります。

*os.FileStat とその位置づけ

Go 1より前のバージョンや、内部的な実装において、os.FileInfo インターフェースの具体的な実装として *os.FileStat のような構造体が使われることがありました。しかし、FileStat はGoの os パッケージの外部に公開されることを意図した型ではありませんでした。FileInfo インターフェースの目的は、その具体的な実装を隠蔽し、抽象的なインターフェースを通じてファイル情報にアクセスさせることにあります。ドキュメントで *os.FileStat のような非公開の具体的な型に言及することは、この抽象化の原則に反し、ユーザーに混乱を招く可能性がありました。

技術的詳細

このコミットの技術的な核心は、Go 1における os.FileInfo の設計思想の明確化と、それに基づくドキュメントの修正です。

Go 1では、os.FileInfo インターフェースは、ファイルに関する一般的な情報を提供する抽象的な契約として確立されました。このインターフェースの具体的な実装は、各オペレーティングシステム(Unix、Windowsなど)の os パッケージ内部で提供されます。例えば、Unixシステムでは syscall.Stat_t のような構造体が内部的に使用され、それが os.FileInfo インターフェースを満たすようにラップされます。

重要な点は、*os.FileStat という具体的な型が、Goの外部APIとして公開されていないことです。つまり、ユーザーは os パッケージの外部から *os.FileStat 型を直接インスタンス化したり、そのフィールドにアクセスしたりすることはできません。os.Statos.Lstat のような関数は os.FileInfo インターフェースを返すため、ユーザーは常にインターフェースを通じてファイル情報にアクセスします。

このコミットが行うのは、まさにこの点をドキュメントで明確にすることです。以前のドキュメントでは、「FileInfo インターフェースの実装、*os.FileStat」という記述がありましたが、これは *os.FileStatFileInfo の唯一の、あるいは公開された実装であるかのような誤解を与える可能性がありました。

変更後のドキュメントでは、「FileInfo インターフェースの実装」とだけ記述し、具体的な実装型への言及を削除しています。これにより、FileInfo が抽象的なインターフェースであり、その具体的な実装はOSに依存し、かつ通常はユーザーが直接扱う必要がないというGoの設計原則がより正確に伝わるようになりました。

Sys() メソッドについては、引き続きドキュメントで言及されています。これは、OS固有のファイル情報にアクセスするための「脱出ハッチ」として機能するためです。しかし、Sys() が返す interface{} の具体的な型は、ユーザーが型アサーション(例: info.Sys().(*syscall.Stat_t))を使って、OS固有のパッケージ(例: syscall)の型にキャストすることで初めて利用可能になります。このプロセスは、FileInfo の抽象性を維持しつつ、必要に応じて低レベルな情報にアクセスする手段を提供します。

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

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

  1. doc/go1.html
  2. doc/go1.tmpl

両方のファイルで、以下の行が変更されました。

変更前:

implementation of the <code>FileInfo</code> interface, <code>*os.FileStat</code>,
which has a <code>Sys</code> method that returns the

変更後:

implementation of the <code>FileInfo</code> interface, which
has a <code>Sys</code> method that returns the

具体的には、<code>*os.FileStat</code>, の部分が削除されています。

コアとなるコードの解説

変更されたコードは、Go 1のリリースノートの一部であるドキュメントです。このドキュメントは、Go 1で導入された変更点やAPIの安定化について説明しています。

削除された <code>*os.FileStat</code>, という記述は、os.FileInfo インターフェースの具体的な実装が *os.FileStat であるかのように示していました。しかし、前述の通り、*os.FileStat はGoの外部APIとして公開されておらず、ユーザーが直接扱うことを意図していません。

この変更により、ドキュメントは os.FileInfo インターフェースが抽象的な概念であり、その具体的な実装はOSに依存し、ユーザーが直接知る必要がないことをより正確に表現するようになりました。Sys() メソッドに関する記述は残されており、これはOS固有のファイル情報にアクセスするための手段として引き続き重要であることを示しています。

この修正は、GoのAPIドキュメンテーションの正確性と一貫性を向上させ、Go 1の設計原則をより明確に伝えるための重要なステップでした。

関連リンク

参考にした情報源リンク