[インデックス 10138] ファイルの概要
このコミットは、Go言語のgo/build
パッケージ内のテストコードにおいて、os.Error
型を使用しないように変更するものです。具体的には、テスト用のダミーパッケージ定義と、そのパッケージ内のダミー関数Foo
の戻り値の型をos.Error
から*bytes.Buffer
に変更しています。これは、Go言語のエラーハンドリングの進化に伴い、os.Error
が非推奨となり、より汎用的なerror
インターフェースが導入された背景を反映した変更と考えられます。テストコードから古いエラー型への依存を取り除くことで、将来的な互換性の問題を防ぎ、コードベースの健全性を保つことを目的としています。
コミット
- コミットハッシュ:
134d6e4fc4b6ef31f292f2f69c3af8f94dd9f987
- 作者: Russ Cox rsc@golang.org
- コミット日時: 2011年10月27日 木曜日 19:39:40 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/134d6e4fc4b6ef31f292f2f69c3af8f94dd9f987
元コミット内容
go/build: avoid os.Error in tests
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5308061
変更の背景
このコミットが行われた2011年10月という時期は、Go言語がまだ比較的新しく、言語仕様や標準ライブラリが活発に進化していた時期にあたります。特にエラーハンドリングのメカニズムは、Go 1のリリースに向けて大きな変更が加えられていました。
初期のGo言語では、エラーを表すためにos.Error
という具体的な型が使用されていました。しかし、この設計では、異なるパッケージやライブラリが独自のエラー型を定義する際に、それらを統一的に扱うことが難しいという問題がありました。また、os.Error
はインターフェースではなく、具体的な構造体であったため、柔軟性に欠けていました。
Go 1のリリースに向けて、Go言語の設計者たちは、より柔軟で強力なエラーハンドリングメカニズムとして、組み込みのerror
インターフェースを導入することを決定しました。このerror
インターフェースは、Error() string
メソッドを持つ任意の型が実装できるため、開発者は独自のエラー型を自由に定義し、それらをerror
インターフェースとして統一的に扱うことができるようになりました。
このコミットは、このようなGo言語のエラーハンドリングの進化、特にos.Error
からerror
インターフェースへの移行という大きな流れの中で行われました。テストコードが古いos.Error
型に依存していると、将来的にその型が完全に削除された場合や、新しいエラーハンドリングの慣習に合致しない場合に問題が生じる可能性があります。そのため、テストコードからos.Error
への依存を取り除き、より現代的なGoのエラーハンドリングの慣習に沿った形に修正することが必要とされました。
go/build
パッケージは、Goのビルドシステムがソースコードを解析し、パッケージの依存関係を解決するために使用する重要なパッケージです。このパッケージのテストコードが古いエラー型に依存していることは、Goのビルドプロセス自体の健全性にも影響を及ぼす可能性があるため、この修正は重要でした。
前提知識の解説
Go言語のエラーハンドリングの歴史とos.Error
Go言語のエラーハンドリングは、他の多くの言語とは異なり、例外機構(try-catchなど)を使用せず、関数の戻り値としてエラーを明示的に返すスタイルを採用しています。
初期のGo言語(Go 1より前)では、エラーを表すためにos.Error
という型が使われていました。これは以下のように定義されていました(概念的なもので、実際の定義とは異なる場合があります):
// 初期Go言語におけるos.Errorの概念
type Error struct {
s string
}
func (e *Error) String() string {
return e.s
}
// os.NewErrorのような関数でエラーを作成
func NewError(text string) *Error {
return &Error{text}
}
このos.Error
は、具体的な構造体であり、エラーメッセージを保持していました。しかし、このアプローチにはいくつかの課題がありました。
- 柔軟性の欠如: 開発者が独自のエラー型を定義し、それに付加情報(エラーコード、スタックトレースなど)を持たせたい場合、
os.Error
を直接拡張することは困難でした。 - 統一性の問題: 異なるライブラリがそれぞれ独自のエラー型を定義した場合、それらを統一的に処理するための共通のインターフェースがありませんでした。
これらの課題を解決するため、Go 1のリリースに向けて、os.Error
は非推奨となり、組み込みのerror
インターフェースが導入されました。
error
インターフェース
Go言語の組み込みerror
インターフェースは、非常にシンプルに定義されています。
type error interface {
Error() string
}
このインターフェースは、Error() string
という単一のメソッドを持つ任意の型が実装できます。これにより、開発者は以下のようなメリットを享受できるようになりました。
- カスタムエラー型の定義: 開発者は、独自の構造体や型を定義し、それに
Error() string
メソッドを実装することで、カスタムエラー型を作成できます。これにより、エラーに付加情報を持たせたり、エラーの種類に応じて異なる処理を行ったりすることが容易になります。type MyCustomError struct { Code int Message string } func (e *MyCustomError) Error() string { return fmt.Sprintf("Error %d: %s", e.Code, e.Message) }
- 統一的なエラー処理: 関数は戻り値として
error
インターフェースを返すことで、具体的なエラー型に依存することなく、あらゆる種類のエラーを統一的に扱うことができます。呼び出し側は、型アサーションや型スイッチを使って、特定のエラー型をチェックすることも可能です。
この変更により、Goのエラーハンドリングはより強力で柔軟なものになりました。このコミットは、このような言語の進化にテストコードを追従させるための典型的な例と言えます。
go/build
パッケージ
go/build
パッケージは、Goの標準ライブラリの一部であり、Goのソースコードパッケージに関する情報を提供します。このパッケージは、Goのビルドツール(go build
, go install
など)が、ソースファイルの解析、パッケージの依存関係の解決、ビルドタグの処理などを行う際に内部的に使用します。
主な機能としては、以下のようなものがあります。
- パッケージの検索: 指定されたパスやインポートパスからGoパッケージを検索します。
- パッケージ情報の解析: パッケージ内のGoファイル、Cファイル、アセンブリファイル、テストファイルなどのリスト、インポートされるパッケージのリスト、ビルドタグなどの情報を解析します。
- ビルドコンテキストの管理: ターゲットOS、アーキテクチャ、Goバージョンなどのビルド環境に関する情報を提供します。
このコミットで変更されているbuild_test.go
は、go/build
パッケージ自体のテストコードであり、pkgtest
はテストのために用意されたダミーのパッケージです。
技術的詳細
このコミットの技術的詳細は、Go言語のエラーハンドリングの進化と、テストコードにおけるその影響に集約されます。
os.Error
から*bytes.Buffer
への変更の意図
コミットメッセージにある「avoid os.Error in tests」という文言が示す通り、この変更の主目的は、テストコードから非推奨となったos.Error
型への依存を取り除くことです。
しかし、なぜos.Error
の代わりに*bytes.Buffer
が選ばれたのでしょうか? *bytes.Buffer
はエラー型ではありません。これは、テストコードの特定の文脈を理解することで説明できます。
src/pkg/go/build/pkgtest/pkgtest.go
の変更を見ると、Foo()
関数の戻り値の型がos.Error
から*bytes.Buffer
に変更されています。
- func Foo() os.Error {
+ func Foo() *bytes.Buffer {
return nil
}
そして、src/pkg/go/build/build_test.go
の変更では、buildPkgs
というテスト用の構造体配列の定義において、pkgtest
パッケージがインポートするパッケージのリストから"os"
が削除され、代わりに"bytes"
が追加されています。
- Imports: []string{"os"},
+ Imports: []string{"bytes"},
これは、buildPkgs
がgo/build
パッケージのテストのために、架空のGoパッケージのメタデータを定義していることを示しています。このメタデータには、その架空のパッケージがインポートする他のパッケージのリストも含まれています。
この文脈では、pkgtest.Foo()
関数が実際にエラーを返す必要はありません。この関数は、go/build
パッケージがGoソースコードを解析する際に、関数のシグネチャ(特に戻り値の型)を正しく認識できるかをテストするための「ダミー」として存在しています。
Go 1以降、os.Error
はerror
インターフェースに置き換えられました。しかし、テストコードでは、単に「何らかの型」を返す関数が必要であり、それが実際にエラーである必要はありませんでした。*bytes.Buffer
は、標準ライブラリに存在する一般的なポインタ型であり、nil
を返すことができるため、os.Error
の代わりとして、テストの目的を損なわずに使用できる適切な型として選ばれたと考えられます。
つまり、この変更は、os.Error
が非推奨になったため、テストコード内でその型を使用し続けることを避けるためのものであり、*bytes.Buffer
は、その目的を達成するための「無害な代替型」として選ばれたと解釈できます。これにより、テストコードはGo言語の最新のエラーハンドリングの慣習に準拠し、将来的なGoのバージョンアップにも対応しやすくなります。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
src/pkg/go/build/build_test.go
src/pkg/go/build/pkgtest/pkgtest.go
それぞれの変更点を以下に示します。
diff --git a/src/pkg/go/build/build_test.go b/src/pkg/go/build/build_test.go
index 68a4180c90..398e31ce26 100644
--- a/src/pkg/go/build/build_test.go
+++ b/src/pkg/go/build/build_test.go
@@ -28,7 +28,7 @@ var buildPkgs = []struct {
GoFiles: []string{"pkgtest.go"},
SFiles: []string{"sqrt_" + runtime.GOARCH + ".s"},
Package: "pkgtest",
- Imports: []string{"os"},
+ Imports: []string{"bytes"},
TestImports: []string{"fmt", "pkgtest"},
TestGoFiles: sortstr([]string{"sqrt_test.go", "sqrt_" + runtime.GOARCH + "_test.go"}),
XTestGoFiles: []string{"xsqrt_test.go"},
diff --git a/src/pkg/go/build/pkgtest/pkgtest.go b/src/pkg/go/build/pkgtest/pkgtest.go
index 03ebb9893a..08eea1e2bc 100644
--- a/src/pkg/go/build/pkgtest/pkgtest.go
+++ b/src/pkg/go/build/pkgtest/pkgtest.go
@@ -4,9 +4,9 @@
package pkgtest
-import "os"
+import "bytes"
-func Foo() os.Error {
+func Foo() *bytes.Buffer {
return nil
}
コアとなるコードの解説
src/pkg/go/build/build_test.go
の変更
このファイルでは、buildPkgs
という変数(struct
のスライス)が定義されています。このbuildPkgs
は、go/build
パッケージのテストのために、様々なGoパッケージの構造を模倣したメタデータを提供します。
変更箇所は以下の通りです。
- Imports: []string{"os"},
+ Imports: []string{"bytes"},
これは、pkgtest
という名前のダミーパッケージがインポートするパッケージのリストを定義している部分です。
- 変更前は、
"os"
パッケージをインポートすると定義されていました。これは、pkgtest.go
内のFoo()
関数がos.Error
を返していたため、その型を使用するためにos
パッケージが必要だったことを示唆しています。 - 変更後は、
"bytes"
パッケージをインポートすると定義されています。これは、pkgtest.go
内のFoo()
関数の戻り値の型が*bytes.Buffer
に変更されたことに対応しています。*bytes.Buffer
型はbytes
パッケージで定義されているため、この変更が必要となります。
この変更は、go/build
パッケージがGoソースコードを解析する際に、インポートパスを正しく解決できるかをテストする側面も持っています。
src/pkg/go/build/pkgtest/pkgtest.go
の変更
このファイルは、go/build
パッケージのテストのために用意された、非常にシンプルなダミーのGoパッケージです。
変更箇所は以下の通りです。
- import "os"
+ import "bytes"
- func Foo() os.Error {
+ func Foo() *bytes.Buffer {
return nil
}
import
文の変更:- 変更前は
"os"
パッケージをインポートしていました。これは、Foo()
関数がos.Error
型を返していたためです。 - 変更後は
"bytes"
パッケージをインポートしています。これは、Foo()
関数の戻り値の型が*bytes.Buffer
に変更されたため、その型が定義されているbytes
パッケージが必要になったためです。
- 変更前は
Foo()
関数のシグネチャ変更:- 変更前は
func Foo() os.Error
と定義されており、os.Error
型の値を返していました(この場合はnil
)。 - 変更後は
func Foo() *bytes.Buffer
と定義されており、*bytes.Buffer
型の値を返しています(この場合もnil
)。
- 変更前は
このFoo()
関数は、実際に何か意味のある処理を行うわけではなく、go/build
パッケージがGoのソースコードを解析する際に、関数のシグネチャ(特に戻り値の型)を正しく識別できるか、そしてその型が属するパッケージのインポートを正しく認識できるかをテストするためのものです。os.Error
が非推奨になったため、テストの目的を損なわずに、別の適切な型(この場合は*bytes.Buffer
)に置き換えられました。
これらの変更は、Go言語のエラーハンドリングの進化に合わせて、go/build
パッケージのテストコードを最新のGoの慣習に準拠させるためのものです。
関連リンク
- Gerrit Change-ID:
https://golang.org/cl/5308061
(元のコミットメッセージに記載されているGerritの変更リストへのリンク)
参考にした情報源リンク
- Go言語のエラーハンドリングの歴史と
os.Error
に関する情報 - Go言語の
error
インターフェースに関する公式ドキュメント - Go言語の
go/build
パッケージに関する公式ドキュメント - Go言語の
bytes
パッケージに関する公式ドキュメント - Go 1 Release Notes (Error Handling)# [インデックス 10138] ファイルの概要
このコミットは、Go言語のgo/build
パッケージ内のテストコードにおいて、os.Error
型を使用しないように変更するものです。具体的には、テスト用のダミーパッケージ定義と、そのパッケージ内のダミー関数Foo
の戻り値の型をos.Error
から*bytes.Buffer
に変更しています。これは、Go言語のエラーハンドリングの進化に伴い、os.Error
が非推奨となり、より汎用的なerror
インターフェースが導入された背景を反映した変更と考えられます。テストコードから古いエラー型への依存を取り除くことで、将来的な互換性の問題を防ぎ、コードベースの健全性を保つことを目的としています。
コミット
- コミットハッシュ:
134d6e4fc4b6ef31f292f2f69c3af8f94dd9f987
- 作者: Russ Cox rsc@golang.org
- コミット日時: 2011年10月27日 木曜日 19:39:40 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/134d6e4fc4b6ef31f292f2f69c3af8f94dd9f987
元コミット内容
go/build: avoid os.Error in tests
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5308061
変更の背景
このコミットが行われた2011年10月という時期は、Go言語がまだ比較的新しく、言語仕様や標準ライブラリが活発に進化していた時期にあたります。特にエラーハンドリングのメカニズムは、Go 1のリリースに向けて大きな変更が加えられていました。
初期のGo言語では、エラーを表すためにos.Error
という具体的な型が使用されていました。しかし、この設計では、異なるパッケージやライブラリが独自のエラー型を定義する際に、それらを統一的に扱うことが難しいという問題がありました。また、os.Error
はインターフェースではなく、具体的な構造体であったため、柔軟性に欠けていました。
Go 1のリリースに向けて、Go言語の設計者たちは、より柔軟で強力なエラーハンドリングメカニズムとして、組み込みのerror
インターフェースを導入することを決定しました。このerror
インターフェースは、Error() string
メソッドを持つ任意の型が実装できるため、開発者は独自のエラー型を自由に定義し、それらをerror
インターフェースとして統一的に扱うことができるようになりました。
このコミットは、このようなGo言語のエラーハンドリングの進化、特にos.Error
からerror
インターフェースへの移行という大きな流れの中で行われました。テストコードが古いos.Error
型に依存していると、将来的にその型が完全に削除された場合や、新しいエラーハンドリングの慣習に合致しない場合に問題が生じる可能性があります。そのため、テストコードからos.Error
への依存を取り除き、より現代的なGoのエラーハンドリングの慣習に沿った形に修正することが必要とされました。
go/build
パッケージは、Goのビルドシステムがソースコードを解析し、パッケージの依存関係を解決するために使用する重要なパッケージです。このパッケージのテストコードが古いエラー型に依存していることは、Goのビルドプロセス自体の健全性にも影響を及ぼす可能性があるため、この修正は重要でした。
前提知識の解説
Go言語のエラーハンドリングの歴史とos.Error
Go言語のエラーハンドリングは、他の多くの言語とは異なり、例外機構(try-catchなど)を使用せず、関数の戻り値としてエラーを明示的に返すスタイルを採用しています。
初期のGo言語(Go 1より前)では、エラーを表すためにos.Error
という型が使われていました。これは以下のように定義されていました(概念的なもので、実際の定義とは異なる場合があります):
// 初期Go言語におけるos.Errorの概念
type Error struct {
s string
}
func (e *Error) String() string {
return e.s
}
// os.NewErrorのような関数でエラーを作成
func NewError(text string) *Error {
return &Error{text}
}
このos.Error
は、具体的な構造体であり、エラーメッセージを保持していました。しかし、このアプローチにはいくつかの課題がありました。
- 柔軟性の欠如: 開発者が独自のエラー型を定義し、それに付加情報(エラーコード、スタックトレースなど)を持たせたい場合、
os.Error
を直接拡張することは困難でした。 - 統一性の問題: 異なるライブラリがそれぞれ独自のエラー型を定義した場合、それらを統一的に処理するための共通のインターフェースがありませんでした。
これらの課題を解決するため、Go 1のリリースに向けて、os.Error
は非推奨となり、組み込みのerror
インターフェースが導入されました。
error
インターフェース
Go言語の組み込みerror
インターフェースは、非常にシンプルに定義されています。
type error interface {
Error() string
}
このインターフェースは、Error() string
という単一のメソッドを持つ任意の型が実装できます。これにより、開発者は以下のようなメリットを享受できるようになりました。
- カスタムエラー型の定義: 開発者は、独自の構造体や型を定義し、それに
Error() string
メソッドを実装することで、カスタムエラー型を作成できます。これにより、エラーに付加情報を持たせたり、エラーの種類に応じて異なる処理を行ったりすることが容易になります。type MyCustomError struct { Code int Message string } func (e *MyCustomError) Error() string { return fmt.Sprintf("Error %d: %s", e.Code, e.Message) }
- 統一的なエラー処理: 関数は戻り値として
error
インターフェースを返すことで、具体的なエラー型に依存することなく、あらゆる種類のエラーを統一的に扱うことができます。呼び出し側は、型アサーションや型スイッチを使って、特定のエラー型をチェックすることも可能です。
この変更により、Goのエラーハンドリングはより強力で柔軟なものになりました。このコミットは、このような言語の進化にテストコードを追従させるための典型的な例と言えます。
go/build
パッケージ
go/build
パッケージは、Goの標準ライブラリの一部であり、Goのソースコードパッケージに関する情報を提供します。このパッケージは、Goのビルドツール(go build
, go install
など)が、ソースファイルの解析、パッケージの依存関係の解決、ビルドタグの処理などを行う際に内部的に使用します。
主な機能としては、以下のようなものがあります。
- パッケージの検索: 指定されたパスやインポートパスからGoパッケージを検索します。
- パッケージ情報の解析: パッケージ内のGoファイル、Cファイル、アセンブリファイル、テストファイルなどのリスト、インポートされるパッケージのリスト、ビルドタグなどの情報を解析します。
- ビルドコンテキストの管理: ターゲットOS、アーキテクチャ、Goバージョンなどのビルド環境に関する情報を提供します。
このコミットで変更されているbuild_test.go
は、go/build
パッケージ自体のテストコードであり、pkgtest
はテストのために用意されたダミーのパッケージです。
技術的詳細
このコミットの技術的詳細は、Go言語のエラーハンドリングの進化と、テストコードにおけるその影響に集約されます。
os.Error
から*bytes.Buffer
への変更の意図
コミットメッセージにある「avoid os.Error in tests」という文言が示す通り、この変更の主目的は、テストコードから非推奨となったos.Error
型への依存を取り除くことです。
しかし、なぜos.Error
の代わりに*bytes.Buffer
が選ばれたのでしょうか? *bytes.Buffer
はエラー型ではありません。これは、テストコードの特定の文脈を理解することで説明できます。
src/pkg/go/build/pkgtest/pkgtest.go
の変更を見ると、Foo()
関数の戻り値の型がos.Error
から*bytes.Buffer
に変更されています。
- func Foo() os.Error {
+ func Foo() *bytes.Buffer {
return nil
}
そして、src/pkg/go/build/build_test.go
の変更では、buildPkgs
というテスト用の構造体配列の定義において、pkgtest
パッケージがインポートするパッケージのリストから"os"
が削除され、代わりに"bytes"
が追加されています。
- Imports: []string{"os"},
+ Imports: []string{"bytes"},
これは、buildPkgs
がgo/build
パッケージのテストのために、架空のGoパッケージのメタデータを定義していることを示しています。このメタデータには、その架空のパッケージがインポートする他のパッケージのリストも含まれています。
この文脈では、pkgtest.Foo()
関数が実際にエラーを返す必要はありません。この関数は、go/build
パッケージがGoソースコードを解析する際に、関数のシグネチャ(特に戻り値の型)を正しく認識できるかをテストするための「ダミー」として存在しています。
Go 1以降、os.Error
はerror
インターフェースに置き換えられました。しかし、テストコードでは、単に「何らかの型」を返す関数が必要であり、それが実際にエラーである必要はありませんでした。*bytes.Buffer
は、標準ライブラリに存在する一般的なポインタ型であり、nil
を返すことができるため、os.Error
の代わりとして、テストの目的を損なわずに使用できる適切な型として選ばれたと考えられます。
つまり、この変更は、os.Error
が非推奨になったため、テストコード内でその型を使用し続けることを避けるためのものであり、*bytes.Buffer
は、その目的を達成するための「無害な代替型」として選ばれたと解釈できます。これにより、テストコードはGo言語の最新のエラーハンドリングの慣習に準拠し、将来的なGoのバージョンアップにも対応しやすくなります。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
src/pkg/go/build/build_test.go
src/pkg/go/build/pkgtest/pkgtest.go
それぞれの変更点を以下に示します。
diff --git a/src/pkg/go/build/build_test.go b/src/pkg/go/build/build_test.go
index 68a4180c90..398e31ce26 100644
--- a/src/pkg/go/build/build_test.go
+++ b/src/pkg/go/build/build_test.go
@@ -28,7 +28,7 @@ var buildPkgs = []struct {
GoFiles: []string{"pkgtest.go"},
SFiles: []string{"sqrt_" + runtime.GOARCH + ".s"},
Package: "pkgtest",
- Imports: []string{"os"},
+ Imports: []string{"bytes"},
TestImports: []string{"fmt", "pkgtest"},
TestGoFiles: sortstr([]string{"sqrt_test.go", "sqrt_" + runtime.GOARCH + "_test.go"}),
XTestGoFiles: []string{"xsqrt_test.go"},
diff --git a/src/pkg/go/build/pkgtest/pkgtest.go b/src/pkg/go/build/pkgtest/pkgtest.go
index 03ebb9893a..08eea1e2bc 100644
--- a/src/pkg/go/build/pkgtest/pkgtest.go
+++ b/src/pkg/go/build/pkgtest/pkgtest.go
@@ -4,9 +4,9 @@
package pkgtest
-import "os"
+import "bytes"
-func Foo() os.Error {
+func Foo() *bytes.Buffer {
return nil
}
コアとなるコードの解説
src/pkg/go/build/build_test.go
の変更
このファイルでは、buildPkgs
という変数(struct
のスライス)が定義されています。このbuildPkgs
は、go/build
パッケージのテストのために、様々なGoパッケージの構造を模倣したメタデータを提供します。
変更箇所は以下の通りです。
- Imports: []string{"os"},
+ Imports: []string{"bytes"},
これは、pkgtest
という名前のダミーパッケージがインポートするパッケージのリストを定義している部分です。
- 変更前は、
"os"
パッケージをインポートすると定義されていました。これは、pkgtest.go
内のFoo()
関数がos.Error
を返していたため、その型を使用するためにos
パッケージが必要だったことを示唆しています。 - 変更後は、
"bytes"
パッケージをインポートすると定義されています。これは、pkgtest.go
内のFoo()
関数の戻り値の型が*bytes.Buffer
に変更されたことに対応しています。*bytes.Buffer
型はbytes
パッケージで定義されているため、この変更が必要となります。
この変更は、go/build
パッケージがGoソースコードを解析する際に、インポートパスを正しく解決できるかをテストする側面も持っています。
src/pkg/go/build/pkgtest/pkgtest.go
の変更
このファイルは、go/build
パッケージのテストのために用意された、非常にシンプルなダミーのGoパッケージです。
変更箇所は以下の通りです。
- import "os"
+ import "bytes"
- func Foo() os.Error {
+ func Foo() *bytes.Buffer {
return nil
}
import
文の変更:- 変更前は
"os"
パッケージをインポートしていました。これは、Foo()
関数がos.Error
型を返していたためです。 - 変更後は
"bytes"
パッケージをインポートしています。これは、Foo()
関数の戻り値の型が*bytes.Buffer
に変更されたため、その型が定義されているbytes
パッケージが必要になったためです。
- 変更前は
Foo()
関数のシグネチャ変更:- 変更前は
func Foo() os.Error
と定義されており、os.Error
型の値を返していました(この場合はnil
)。 - 変更後は
func Foo() *bytes.Buffer
と定義されており、*bytes.Buffer
型の値を返しています(この場合もnil
)。
- 変更前は
このFoo()
関数は、実際に何か意味のある処理を行うわけではなく、go/build
パッケージがGoのソースコードを解析する際に、関数のシグネチャ(特に戻り値の型)を正しく識別できるか、そしてその型が属するパッケージのインポートを正しく認識できるかをテストするためのものです。os.Error
が非推奨になったため、テストの目的を損なわずに、別の適切な型(この場合は*bytes.Buffer
)に置き換えられました。
これらの変更は、Go言語のエラーハンドリングの進化に合わせて、go/build
パッケージのテストコードを最新のGoの慣習に準拠させるためのものです。
関連リンク
- Gerrit Change-ID:
https://golang.org/cl/5308061
(元のコミットメッセージに記載されているGerritの変更リストへのリンク)