[インデックス 10190] ファイルの概要
コミット
このコミットは、Go言語の標準ライブラリにおける広範なコードベースのリファクタリングであり、os.Error
型の使用を、より汎用的な組み込みの error
インターフェースに置き換えることを目的としています。また、os.EOF
を io.EOF
に変更する修正も含まれています。これは、Go言語のエラーハンドリングの進化における重要なマイルストーンを示しています。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c2049d2dfeeea3d41fafa91e3e3f0e47c285355b
元コミット内容
src/pkg/[a-m]*: gofix -r error -force=error
R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/5322051
このコミットメッセージは、gofix
ツールを使用して、src/pkg
ディレクトリ内の a
から m
で始まるパッケージに対して、os.Error
を error
に置き換える自動リファクタリングが実行されたことを示しています。-force=error
オプションは、この変更が強制的に適用されたことを意味します。
変更の背景
Go言語の初期バージョンでは、エラーを表現するために os.Error
という具体的な型が使用されていました。しかし、Go言語の設計思想は、インターフェースによる抽象化と柔軟性を重視しています。os.Error
は error
インターフェースを実装していましたが、特定のパッケージ (os
) に紐付けられた具体的な型であるため、エラーの表現に不必要な制約をもたらしていました。
この変更の背景には、以下の目的があります。
- 汎用性と一貫性の向上:
os.Error
をerror
インターフェースに置き換えることで、エラーの型が特定のパッケージに依存せず、より汎用的な表現になります。これにより、異なるパッケージ間でエラーをより一貫した方法で処理できるようになります。 - 柔軟性の向上:
error
インターフェースは、Error() string
メソッドを持つ任意の型をエラーとして扱うことを可能にします。これにより、開発者はカスタムエラー型を自由に定義し、より詳細なエラー情報や振る舞いをエラーに含めることができるようになります。 gofix
ツールの活用:gofix
は、Go言語のAPI変更に伴うコードの自動更新を支援するツールです。この大規模なリファクタリングは、gofix
を活用することで効率的に行われました。これは、Go言語の進化において、後方互換性を維持しつつコードベースを改善するための重要なアプローチです。io.EOF
への統一:os.EOF
はファイル操作におけるEOF(End Of File)を示すエラーでしたが、io
パッケージにも同様のio.EOF
が存在しました。このコミットでは、EOFの表現をio.EOF
に統一することで、I/O操作におけるエラーハンドリングの一貫性を高めています。
前提知識の解説
Go言語のエラーハンドリング
Go言語では、例外処理のメカニズム(try-catchなど)は採用されていません。代わりに、関数は通常、最後の戻り値として error
型の値を返します。慣例として、エラーがない場合は nil
を返し、エラーがある場合は非 nil
の error
値を返します。
error
インターフェース
Go言語の組み込み型である error
は、以下のように定義されたインターフェースです。
type error interface {
Error() string
}
このインターフェースは、Error() string
メソッドを持つ任意の型が error
として扱われることを意味します。これにより、開発者は独自のカスタムエラー型を定義し、エラーに関する追加情報(エラーコード、詳細メッセージなど)を含めることができます。
os
パッケージと io
パッケージ
os
パッケージ: オペレーティングシステムとの相互作用(ファイルシステム、プロセス、環境変数など)を提供します。初期のGo言語では、ファイル操作に関連するエラー型としてos.Error
が定義されていました。io
パッケージ: I/Oプリミティブ(Reader、Writerなど)を提供します。io.EOF
は、入力の終わりに達したことを示すエラーとして定義されています。
gofix
ツール
gofix
は、Go言語のAPI変更や慣習の進化に合わせて、既存のGoコードを自動的に更新するためのコマンドラインツールです。これにより、大規模なコードベースでも、手動での修正に比べてはるかに効率的に移行作業を行うことができます。
技術的詳細
このコミットの技術的な核心は、Go言語のエラーハンドリングモデルの成熟にあります。
os.Error
から error
への移行
初期のGo言語では、os.Error
は以下のように定義されていました。
// os.Error (Go 1.0より前のバージョン)
type Error interface {
String() string
}
// os.NewError (Go 1.0より前のバージョン)
func NewError(s string) Error { return errorString(s) }
type errorString string
func (e errorString) String() string { return string(e) }
このコミットでは、os.Error
という具体的な型を直接使用する代わりに、Goの組み込み error
インターフェースを使用するように変更されました。これにより、エラーの生成には errors
パッケージの errors.New
関数が推奨されるようになりました。
// Go 1.0以降
package errors
func New(text string) error { return &errorString{text} }
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
この変更により、コードはより抽象的になり、os
パッケージに依存しないエラー処理が可能になります。例えば、archive/tar
パッケージの HeaderError
の定義が os.NewError
から errors.New
に変更されています。
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -9,6 +9,7 @@ package tar
import (
"bytes"
+ "errors"
"io"
"io/ioutil"
"os"
@@ -16,7 +17,7 @@ import (
)
var (
- HeaderError = os.NewError("invalid tar header")
+ HeaderError = errors.New("invalid tar header")
)
また、関数の戻り値の型も os.Error
から error
に変更されています。
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -48,7 +49,7 @@ type Reader struct {
func NewReader(r io.Reader) *Reader { return &Reader{r: r} }
// Next advances to the next entry in the tar archive.
-func (tr *Reader) Next() (*Header, os.Error) {
+func (tr *Reader) Next() (*Header, error) {
var hdr *Header
if tr.err == nil {
tr.skipUnread()
os.EOF
から io.EOF
への移行
同様に、ファイル終端を示すエラーも os.EOF
から io.EOF
に統一されました。これは、EOFがファイルシステム固有のエラーではなく、一般的なI/O操作のエラーとして扱われるべきであるという設計思想に基づいています。
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -119,7 +120,7 @@ func (tr *Reader) readHeader() *Header {
return nil
}
if bytes.Equal(header, zeroBlock[0:blockSize]) {
- tr.err = os.EOF
+ tr.err = io.EOF
} else {
tr.err = HeaderError // zero block and then non-zero block
}
@@ -201,10 +202,10 @@ func (tr *Reader) readHeader() *Header {
// Read reads from the current entry in the tar archive.
// It returns 0, os.EOF when it reaches the end of that entry,\n // until Next is called to advance to the next entry.
-func (tr *Reader) Read(b []byte) (n int, err os.Error) {
+func (tr *Reader) Read(b []byte) (n int, err error) {
if tr.nb == 0 {
// file consumed
- return 0, os.EOF
+ return 0, io.EOF
}
if int64(len(b)) > tr.nb {
@@ -213,7 +214,7 @@ func (tr *Reader) Read(b []byte) (n int, err os.Error) {
n, err = tr.r.Read(b)
tr.nb -= int64(n)
- if err == os.EOF && tr.nb > 0 {
+ if err == io.EOF && tr.nb > 0 {
err = io.ErrUnexpectedEOF
}
tr.err = err
この変更は、Go言語の標準ライブラリ全体にわたって行われ、エラーハンドリングの統一性と堅牢性を大幅に向上させました。
コアとなるコードの変更箇所
このコミットは、src/pkg
ディレクトリ内の a
から m
で始まる多数のパッケージに影響を与えています。変更のパターンは以下の2点に集約されます。
os.Error
型のerror
インターフェースへの置き換え:- 関数の戻り値の型が
os.Error
からerror
に変更。 - 変数やフィールドの型が
os.Error
からerror
に変更。 os.NewError(...)
の呼び出しがerrors.New(...)
に変更。os.EOF
の比較がio.EOF
に変更。
- 関数の戻り値の型が
例: src/pkg/archive/tar/reader.go
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -9,6 +9,7 @@ package tar
import (
"bytes"
+ "errors" // errorsパッケージのインポート
"io"
"io/ioutil"
"os"
@@ -16,7 +17,7 @@ import (
)
var (
- HeaderError = os.NewError("invalid tar header") // os.NewErrorからerrors.Newへ
+ HeaderError = errors.New("invalid tar header")
)
// A Reader provides sequential access to the contents of a tar archive.
@@ -39,7 +40,7 @@ var (
//\t}\n type Reader struct {
\tr io.Reader
-\terr os.Error // os.Errorからerrorへ
+\terr error
\tnb int64 // number of unread bytes for current file entry
\tpad int64 // amount of padding (ignored) after current file entry
}
@@ -48,7 +49,7 @@ type Reader struct {
func NewReader(r io.Reader) *Reader { return &Reader{r: r} }
// Next advances to the next entry in the tar archive.
-func (tr *Reader) Next() (*Header, os.Error) { // os.Errorからerrorへ
+func (tr *Reader) Next() (*Header, error) {
var hdr *Header
if tr.err == nil {
tr.skipUnread()
@@ -119,7 +120,7 @@ func (tr *Reader) readHeader() *Header {
return nil
}
if bytes.Equal(header, zeroBlock[0:blockSize]) {
- tr.err = os.EOF // os.EOFからio.EOFへ
+ tr.err = io.EOF
} else {
tr.err = HeaderError // zero block and then non-zero block
}
@@ -201,10 +202,10 @@ func (tr *Reader) readHeader() *Header {
// Read reads from the current entry in the tar archive.
// It returns 0, os.EOF when it reaches the end of that entry,\n // until Next is called to advance to the next entry.
-func (tr *Reader) Read(b []byte) (n int, err os.Error) { // os.Errorからerrorへ
+func (tr *Reader) Read(b []byte) (n int, err error) {
if tr.nb == 0 {
// file consumed
- return 0, os.EOF // os.EOFからio.EOFへ
+ return 0, io.EOF
}
if int64(len(b)) > tr.nb {
@@ -213,7 +214,7 @@ func (tr *Reader) Read(b []byte) (n int, err os.Error) {
n, err = tr.r.Read(b)
tr.nb -= int64(n)
- if err == os.EOF && tr.nb > 0 { // os.EOFからio.EOFへ
+ if err == io.EOF && tr.nb > 0 {
err = io.ErrUnexpectedEOF
}
tr.err = err
コアとなるコードの解説
上記の変更箇所は、Go言語のエラーハンドリングのベストプラクティスへの移行を明確に示しています。
import "errors"
の追加:errors.New
を使用するために、errors
パッケージがインポートされています。これは、エラーの生成がos
パッケージから独立したことを意味します。HeaderError = errors.New("invalid tar header")
:os.NewError
はos
パッケージに特化したエラー生成関数でしたが、errors.New
はGoの標準ライブラリ全体で汎用的にエラーを生成するために使用されます。これにより、エラーの生成方法が一貫します。tr.err error
:Reader
構造体のerr
フィールドの型がos.Error
からerror
インターフェースに変更されています。これにより、このフィールドには任意のカスタムエラー型を含むことができるようになり、将来的な拡張性や柔軟性が向上します。func (tr *Reader) Next() (*Header, error)
:Next
メソッドの戻り値の型もos.Error
からerror
に変更されています。これは、このメソッドが返すエラーがos
パッケージに限定されないことを示します。tr.err = io.EOF
およびreturn 0, io.EOF
:os.EOF
はos
パッケージに定義されていましたが、ファイル終端はファイルシステムだけでなく、あらゆるI/Oストリームで発生する可能性があるため、より汎用的なio.EOF
に置き換えられました。これにより、I/O関連のエラー処理がio
パッケージに集約され、より論理的な構造になります。
これらの変更は、Go言語がより成熟したエラーハンドリングモデルへと進化する過程の一部であり、開発者がより堅牢で柔軟なアプリケーションを構築するための基盤を提供します。
関連リンク
- Go言語の公式ドキュメント: Errors (このコミットの直接的な説明ではありませんが、Goのエラーハンドリングの哲学を理解するのに役立ちます)
- Go言語の公式ドキュメント: The Go Programming Language Specification - Errors
- Go言語の公式ドキュメント:
errors
package - Go言語の公式ドキュメント:
io
package - Go言語の公式ドキュメント:
os
package
参考にした情報源リンク
- Go言語の公式ドキュメント (
pkg.go.dev
) - Go言語のブログ記事 (特にエラーハンドリングに関するもの)
- Go言語のソースコード (このコミットの差分)
gofix
ツールのドキュメント (Go言語のツールに関する情報)
[インデックス 10190] ファイルの概要
このコミットは、Go言語の標準ライブラリにおける広範なコードベースのリファクタリングであり、os.Error
型の使用を、より汎用的な組み込みの error
インターフェースに置き換えることを目的としています。また、os.EOF
を io.EOF
に変更する修正も含まれています。これは、Go言語のエラーハンドリングの進化における重要なマイルストーンを示しています。
コミット
src/pkg/[a-m]*: gofix -r error -force=error
R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/5322051
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c2049d2dfeeea3d41fafa91e3e3f0e47c285355b
元コミット内容
このコミットメッセージは、gofix
ツールを使用して、src/pkg
ディレクトリ内の a
から m
で始まるパッケージに対して、os.Error
を error
に置き換える自動リファクタリングが実行されたことを示しています。-force=error
オプションは、この変更が強制的に適用されたことを意味します。
変更の背景
Go言語の初期バージョンでは、エラーを表現するために os.Error
という具体的な型が使用されていました。しかし、Go言語の設計思想は、インターフェースによる抽象化と柔軟性を重視しています。os.Error
は error
インターフェースを実装していましたが、特定のパッケージ (os
) に紐付けられた具体的な型であるため、エラーの表現に不必要な制約をもたらしていました。
この変更の背景には、以下の目的があります。
- 汎用性と一貫性の向上:
os.Error
をerror
インターフェースに置き換えることで、エラーの型が特定のパッケージに依存せず、より汎用的な表現になります。これにより、異なるパッケージ間でエラーをより一貫した方法で処理できるようになります。 - 柔軟性の向上:
error
インターフェースは、Error() string
メソッドを持つ任意の型をエラーとして扱うことを可能にします。これにより、開発者はカスタムエラー型を自由に定義し、より詳細なエラー情報や振る舞いをエラーに含めることができるようになります。 gofix
ツールの活用:gofix
は、Go言語のAPI変更に伴うコードの自動更新を支援するツールです。この大規模なリファクタリングは、gofix
を活用することで効率的に行われました。これは、Go言語の進化において、後方互換性を維持しつつコードベースを改善するための重要なアプローチです。io.EOF
への統一:os.EOF
はファイル操作におけるEOF(End Of File)を示すエラーでしたが、io
パッケージにも同様のio.EOF
が存在しました。このコミットでは、EOFの表現をio.EOF
に統一することで、I/O操作におけるエラーハンドリングの一貫性を高めています。
前提知識の解説
Go言語のエラーハンドリング
Go言語では、例外処理のメカニズム(try-catchなど)は採用されていません。代わりに、関数は通常、最後の戻り値として error
型の値を返します。慣例として、エラーがない場合は nil
を返し、エラーがある場合は非 nil
の error
値を返します。
error
インターフェース
Go言語の組み込み型である error
は、以下のように定義されたインターフェースです。
type error interface {
Error() string
}
このインターフェースは、Error() string
メソッドを持つ任意の型が error
として扱われることを意味します。これにより、開発者は独自のカスタムエラー型を定義し、エラーに関する追加情報(エラーコード、詳細メッセージなど)を含めることができます。
os
パッケージと io
パッケージ
os
パッケージ: オペレーティングシステムとの相互作用(ファイルシステム、プロセス、環境変数など)を提供します。初期のGo言語では、ファイル操作に関連するエラー型としてos.Error
が定義されていました。io
パッケージ: I/Oプリミティブ(Reader、Writerなど)を提供します。io.EOF
は、入力の終わりに達したことを示すエラーとして定義されています。
gofix
ツール
gofix
は、Go言語のAPI変更や慣習の進化に合わせて、既存のGoコードを自動的に更新するためのコマンドラインツールです。これにより、大規模なコードベースでも、手動での修正に比べてはるかに効率的に移行作業を行うことができます。
技術的詳細
このコミットの技術的な核心は、Go言語のエラーハンドリングモデルの成熟にあります。
os.Error
から error
への移行
初期のGo言語では、os.Error
は以下のように定義されていました。
// os.Error (Go 1.0より前のバージョン)
type Error interface {
String() string
}
// os.NewError (Go 1.0より前のバージョン)
func NewError(s string) Error { return errorString(s) }
type errorString string
func (e errorString) String() string { return string(e) }
このコミットでは、os.Error
という具体的な型を直接使用する代わりに、Goの組み込み error
インターフェースを使用するように変更されました。これにより、エラーの生成には errors
パッケージの errors.New
関数が推奨されるようになりました。
// Go 1.0以降
package errors
func New(text string) error { return &errorString{text} }
type errorString struct {
s string
}
func (e *errorString) Error() string {
return e.s
}
この変更により、コードはより抽象的になり、os
パッケージに依存しないエラー処理が可能になります。例えば、archive/tar
パッケージの HeaderError
の定義が os.NewError
から errors.New
に変更されています。
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -9,6 +9,7 @@ package tar
import (
"bytes"
+ "errors" // errorsパッケージのインポート
"io"
"io/ioutil"
"os"
@@ -16,7 +17,7 @@ import (
)
var (
- HeaderError = os.NewError("invalid tar header") // os.NewErrorからerrors.Newへ
+ HeaderError = errors.New("invalid tar header")
)
また、関数の戻り値の型も os.Error
から error
に変更されています。
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -48,7 +49,7 @@ type Reader struct {
func NewReader(r io.Reader) *Reader { return &Reader{r: r} }
// Next advances to the next entry in the tar archive.
-func (tr *Reader) Next() (*Header, os.Error) { // os.Errorからerrorへ
+func (tr *Reader) Next() (*Header, error) {
var hdr *Header
if tr.err == nil {
tr.skipUnread()
os.EOF
から io.EOF
への移行
同様に、ファイル終端を示すエラーも os.EOF
から io.EOF
に統一されました。これは、EOFがファイルシステム固有のエラーではなく、一般的なI/O操作のエラーとして扱われるべきであるという設計思想に基づいています。
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -119,7 +120,7 @@ func (tr *Reader) readHeader() *Header {
return nil
}
if bytes.Equal(header, zeroBlock[0:blockSize]) {
- tr.err = os.EOF // os.EOFからio.EOFへ
+ tr.err = io.EOF
} else {
tr.err = HeaderError // zero block and then non-zero block
}
@@ -201,10 +202,10 @@ func (tr *Reader) readHeader() *Header {
// Read reads from the current entry in the tar archive.
// It returns 0, os.EOF when it reaches the end of that entry,\n // until Next is called to advance to the next entry.
-func (tr *Reader) Read(b []byte) (n int, err os.Error) { // os.Errorからerrorへ
+func (tr *Reader) Read(b []byte) (n int, err error) {
if tr.nb == 0 {
// file consumed
- return 0, os.EOF // os.EOFからio.EOFへ
+ return 0, io.EOF
}
if int64(len(b)) > tr.nb {
@@ -213,7 +214,7 @@ func (tr *Reader) Read(b []byte) (n int, err os.Error) {
n, err = tr.r.Read(b)
tr.nb -= int64(n)
- if err == os.EOF && tr.nb > 0 { // os.EOFからio.EOFへ
+ if err == io.EOF && tr.nb > 0 {
err = io.ErrUnexpectedEOF
}
tr.err = err
この変更は、Go言語の標準ライブラリ全体にわたって行われ、エラーハンドリングの統一性と堅牢性を大幅に向上させました。
コアとなるコードの変更箇所
このコミットは、src/pkg
ディレクトリ内の a
から m
で始まる多数のパッケージに影響を与えています。変更のパターンは以下の2点に集約されます。
os.Error
型のerror
インターフェースへの置き換え:- 関数の戻り値の型が
os.Error
からerror
に変更。 - 変数やフィールドの型が
os.Error
からerror
に変更。 os.NewError(...)
の呼び出しがerrors.New(...)
に変更。os.EOF
の比較がio.EOF
に変更。
- 関数の戻り値の型が
例: src/pkg/archive/tar/reader.go
--- a/src/pkg/archive/tar/reader.go
+++ b/src/pkg/archive/tar/reader.go
@@ -9,6 +9,7 @@ package tar
import (
"bytes"
+ "errors" // errorsパッケージのインポート
"io"
"io/ioutil"
"os"
@@ -16,7 +17,7 @@ import (
)
var (
- HeaderError = os.NewError("invalid tar header") // os.NewErrorからerrors.Newへ
+ HeaderError = errors.New("invalid tar header")
)
// A Reader provides sequential access to the contents of a tar archive.
@@ -39,7 +40,7 @@ var (
//\t}\n type Reader struct {
\tr io.Reader
-\terr os.Error // os.Errorからerrorへ
+\terr error
\tnb int64 // number of unread bytes for current file entry
\tpad int64 // amount of padding (ignored) after current file entry
}
@@ -48,7 +49,7 @@ type Reader struct {
func NewReader(r io.Reader) *Reader { return &Reader{r: r} }\n \n // Next advances to the next entry in the tar archive.\n-func (tr *Reader) Next() (*Header, os.Error) { // os.Errorからerrorへ
+func (tr *Reader) Next() (*Header, error) {
var hdr *Header
if tr.err == nil {
tr.skipUnread()
@@ -119,7 +120,7 @@ func (tr *Reader) readHeader() *Header {
return nil
}
if bytes.Equal(header, zeroBlock[0:blockSize]) {
- tr.err = os.EOF // os.EOFからio.EOFへ
+ tr.err = io.EOF
} else {
tr.err = HeaderError // zero block and then non-zero block
}
@@ -201,10 +202,10 @@ func (tr *Reader) readHeader() *Header {
// Read reads from the current entry in the tar archive.
// It returns 0, os.EOF when it reaches the end of that entry,\n // until Next is called to advance to the next entry.
-func (tr *Reader) Read(b []byte) (n int, err os.Error) { // os.Errorからerrorへ
+func (tr *Reader) Read(b []byte) (n int, err error) {
if tr.nb == 0 {
// file consumed
- return 0, os.EOF // os.EOFからio.EOFへ
+ return 0, io.EOF
}
if int64(len(b)) > tr.nb {
@@ -213,7 +214,7 @@ func (tr *Reader) Read(b []byte) (n int, err os.Error) {
n, err = tr.r.Read(b)
tr.nb -= int64(n)
- if err == os.EOF && tr.nb > 0 { // os.EOFからio.EOFへ
+ if err == io.EOF && tr.nb > 0 {
err = io.ErrUnexpectedEOF
}
tr.err = err
コアとなるコードの解説
上記の変更箇所は、Go言語のエラーハンドリングのベストプラクティスへの移行を明確に示しています。
import "errors"
の追加:errors.New
を使用するために、errors
パッケージがインポートされています。これは、エラーの生成がos
パッケージから独立したことを意味します。HeaderError = errors.New("invalid tar header")
:os.NewError
はos
パッケージに特化したエラー生成関数でしたが、errors.New
はGoの標準ライブラリ全体で汎用的にエラーを生成するために使用されます。これにより、エラーの生成方法が一貫します。tr.err error
:Reader
構造体のerr
フィールドの型がos.Error
からerror
インターフェースに変更されています。これにより、このフィールドには任意のカスタムエラー型を含むことができるようになり、将来的な拡張性や柔軟性が向上します。func (tr *Reader) Next() (*Header, error)
:Next
メソッドの戻り値の型もos.Error
からerror
に変更されています。これは、このメソッドが返すエラーがos
パッケージに限定されないことを示します。tr.err = io.EOF
およびreturn 0, io.EOF
:os.EOF
はos
パッケージに定義されていましたが、ファイル終端はファイルシステムだけでなく、あらゆるI/Oストリームで発生する可能性があるため、より汎用的なio.EOF
に置き換えられました。これにより、I/O関連のエラー処理がio
パッケージに集約され、より論理的な構造になります。
これらの変更は、Go言語がより成熟したエラーハンドリングモデルへと進化する過程の一部であり、開発者がより堅牢で柔軟なアプリケーションを構築するための基盤を提供します。
関連リンク
- Go言語の公式ドキュメント: Errors (このコミットの直接的な説明ではありませんが、Goのエラーハンドリングの哲学を理解するのに役立ちます)
- Go言語の公式ドキュメント: The Go Programming Language Specification - Errors
- Go言語の公式ドキュメント:
errors
package - Go言語の公式ドキュメント:
io
package - Go言語の公式ドキュメント:
os
package
参考にした情報源リンク
- Go言語の公式ドキュメント (
pkg.go.dev
) - Go言語のブログ記事 (特にエラーハンドリングに関するもの)
- Go言語のソースコード (このコミットの差分)
gofix
ツールのドキュメント (Go言語のツールに関する情報)- Web検索: "Go language os.Error to error transition"