[インデックス 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.Stat
や os.Lstat
のような関数は os.FileInfo
インターフェースを返すため、ユーザーは常にインターフェースを通じてファイル情報にアクセスします。
このコミットが行うのは、まさにこの点をドキュメントで明確にすることです。以前のドキュメントでは、「FileInfo
インターフェースの実装、*os.FileStat
」という記述がありましたが、これは *os.FileStat
が FileInfo
の唯一の、あるいは公開された実装であるかのような誤解を与える可能性がありました。
変更後のドキュメントでは、「FileInfo
インターフェースの実装」とだけ記述し、具体的な実装型への言及を削除しています。これにより、FileInfo
が抽象的なインターフェースであり、その具体的な実装はOSに依存し、かつ通常はユーザーが直接扱う必要がないというGoの設計原則がより正確に伝わるようになりました。
Sys()
メソッドについては、引き続きドキュメントで言及されています。これは、OS固有のファイル情報にアクセスするための「脱出ハッチ」として機能するためです。しかし、Sys()
が返す interface{}
の具体的な型は、ユーザーが型アサーション(例: info.Sys().(*syscall.Stat_t)
)を使って、OS固有のパッケージ(例: syscall
)の型にキャストすることで初めて利用可能になります。このプロセスは、FileInfo
の抽象性を維持しつつ、必要に応じて低レベルな情報にアクセスする手段を提供します。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
doc/go1.html
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の設計原則をより明確に伝えるための重要なステップでした。
関連リンク
- Go Issue #3013: https://github.com/golang/go/issues/3013
- Gerrit Change-ID: https://golang.org/cl/5683049 (GoのコードレビューシステムであるGerritの変更リストへのリンク)
参考にした情報源リンク
- Go Issue Tracker: https://github.com/golang/go/issues
- Go Documentation (Go 1): https://go.dev/doc/go1 (Go 1のリリースノートやドキュメントのアーカイブ)
- Go
os
package documentation: https://pkg.go.dev/os - Go
os.FileInfo
interface documentation: https://pkg.go.dev/os#FileInfo - Go
syscall
package documentation (Unix-specific file info): https://pkg.go.dev/syscall - Go 1 Release Notes (特に
os
パッケージに関する変更点): https://go.dev/doc/go1#os