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

[インデックス 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は、具体的な構造体であり、エラーメッセージを保持していました。しかし、このアプローチにはいくつかの課題がありました。

  1. 柔軟性の欠如: 開発者が独自のエラー型を定義し、それに付加情報(エラーコード、スタックトレースなど)を持たせたい場合、os.Errorを直接拡張することは困難でした。
  2. 統一性の問題: 異なるライブラリがそれぞれ独自のエラー型を定義した場合、それらを統一的に処理するための共通のインターフェースがありませんでした。

これらの課題を解決するため、Go 1のリリースに向けて、os.Errorは非推奨となり、組み込みのerrorインターフェースが導入されました。

errorインターフェース

Go言語の組み込みerrorインターフェースは、非常にシンプルに定義されています。

type error interface {
    Error() string
}

このインターフェースは、Error() stringという単一のメソッドを持つ任意の型が実装できます。これにより、開発者は以下のようなメリットを享受できるようになりました。

  1. カスタムエラー型の定義: 開発者は、独自の構造体や型を定義し、それにError() stringメソッドを実装することで、カスタムエラー型を作成できます。これにより、エラーに付加情報を持たせたり、エラーの種類に応じて異なる処理を行ったりすることが容易になります。
    type MyCustomError struct {
        Code    int
        Message string
    }
    
    func (e *MyCustomError) Error() string {
        return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
    }
    
  2. 統一的なエラー処理: 関数は戻り値として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"},

これは、buildPkgsgo/buildパッケージのテストのために、架空のGoパッケージのメタデータを定義していることを示しています。このメタデータには、その架空のパッケージがインポートする他のパッケージのリストも含まれています。

この文脈では、pkgtest.Foo()関数が実際にエラーを返す必要はありません。この関数は、go/buildパッケージがGoソースコードを解析する際に、関数のシグネチャ(特に戻り値の型)を正しく認識できるかをテストするための「ダミー」として存在しています。

Go 1以降、os.Errorerrorインターフェースに置き換えられました。しかし、テストコードでは、単に「何らかの型」を返す関数が必要であり、それが実際にエラーである必要はありませんでした。*bytes.Bufferは、標準ライブラリに存在する一般的なポインタ型であり、nilを返すことができるため、os.Errorの代わりとして、テストの目的を損なわずに使用できる適切な型として選ばれたと考えられます。

つまり、この変更は、os.Errorが非推奨になったため、テストコード内でその型を使用し続けることを避けるためのものであり、*bytes.Bufferは、その目的を達成するための「無害な代替型」として選ばれたと解釈できます。これにより、テストコードはGo言語の最新のエラーハンドリングの慣習に準拠し、将来的なGoのバージョンアップにも対応しやすくなります。

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

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

  1. src/pkg/go/build/build_test.go
  2. 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言語の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は、具体的な構造体であり、エラーメッセージを保持していました。しかし、このアプローチにはいくつかの課題がありました。

  1. 柔軟性の欠如: 開発者が独自のエラー型を定義し、それに付加情報(エラーコード、スタックトレースなど)を持たせたい場合、os.Errorを直接拡張することは困難でした。
  2. 統一性の問題: 異なるライブラリがそれぞれ独自のエラー型を定義した場合、それらを統一的に処理するための共通のインターフェースがありませんでした。

これらの課題を解決するため、Go 1のリリースに向けて、os.Errorは非推奨となり、組み込みのerrorインターフェースが導入されました。

errorインターフェース

Go言語の組み込みerrorインターフェースは、非常にシンプルに定義されています。

type error interface {
    Error() string
}

このインターフェースは、Error() stringという単一のメソッドを持つ任意の型が実装できます。これにより、開発者は以下のようなメリットを享受できるようになりました。

  1. カスタムエラー型の定義: 開発者は、独自の構造体や型を定義し、それにError() stringメソッドを実装することで、カスタムエラー型を作成できます。これにより、エラーに付加情報を持たせたり、エラーの種類に応じて異なる処理を行ったりすることが容易になります。
    type MyCustomError struct {
        Code    int
        Message string
    }
    
    func (e *MyCustomError) Error() string {
        return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
    }
    
  2. 統一的なエラー処理: 関数は戻り値として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"},

これは、buildPkgsgo/buildパッケージのテストのために、架空のGoパッケージのメタデータを定義していることを示しています。このメタデータには、その架空のパッケージがインポートする他のパッケージのリストも含まれています。

この文脈では、pkgtest.Foo()関数が実際にエラーを返す必要はありません。この関数は、go/buildパッケージがGoソースコードを解析する際に、関数のシグネチャ(特に戻り値の型)を正しく認識できるかをテストするための「ダミー」として存在しています。

Go 1以降、os.Errorerrorインターフェースに置き換えられました。しかし、テストコードでは、単に「何らかの型」を返す関数が必要であり、それが実際にエラーである必要はありませんでした。*bytes.Bufferは、標準ライブラリに存在する一般的なポインタ型であり、nilを返すことができるため、os.Errorの代わりとして、テストの目的を損なわずに使用できる適切な型として選ばれたと考えられます。

つまり、この変更は、os.Errorが非推奨になったため、テストコード内でその型を使用し続けることを避けるためのものであり、*bytes.Bufferは、その目的を達成するための「無害な代替型」として選ばれたと解釈できます。これにより、テストコードはGo言語の最新のエラーハンドリングの慣習に準拠し、将来的なGoのバージョンアップにも対応しやすくなります。

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

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

  1. src/pkg/go/build/build_test.go
  2. 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の変更リストへのリンク)

参考にした情報源リンク