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

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

このコミットは、Go言語の標準ライブラリ sort パッケージ内のテストコードにおける // Output: コメントのフォーマットを修正するものです。具体的には、go test コマンドが期待する出力形式に合わせるため、// Output: の直後に改行を追加し、続く出力行が正しく認識されるように変更しています。これにより、テストの安定性と可読性が向上します。

コミット

commit c01945afc90e17b214ccbc7d49d477075ec8b463
Author: Robert Daniel Kortschak <dan.kortschak@adelaide.edu.au>
Date:   Sun Sep 8 13:21:03 2013 +1000

    sort: fix up example expected output formatting
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/13426046

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

https://github.com/golang/go/commit/c01945afc90e17b214ccbc7d49d477075ec8b463

元コミット内容

sort: fix up example expected output formatting

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/13426046

変更の背景

Go言語のテストフレームワークには、Example 関数という特殊なテスト形式が存在します。これは、コードの利用例を示すと同時に、その出力が期待されるものと一致するかを検証するものです。Example 関数内で fmt.Println などで出力された内容は、関数の末尾に記述された // Output: コメントの後に続く行と比較されます。

このコミットが行われた2013年9月時点では、go test コマンドが // Output: コメントの直後に続く行を期待出力として認識する際に、// Output: と出力内容の間に改行がないと正しくパースできない、あるいは意図しない挙動を示す可能性がありました。

このコミットは、src/pkg/sort/example_interface_test.gosrc/pkg/sort/example_multi_test.goExample 関数において、// Output: コメントの直後に改行が欠けていたために、テストが正しく機能しない、または将来的に問題を引き起こす可能性があったため、そのフォーマットを修正することを目的としています。これにより、go test が期待出力を正確に読み取り、テストの信頼性を確保します。

前提知識の解説

Go言語のテストとExample関数

Go言語には、標準で強力なテストフレームワークが組み込まれています。テストファイルは通常、テスト対象のGoファイルと同じディレクトリに _test.go というサフィックスを付けて配置されます。

テスト関数は func TestXxx(*testing.T) の形式で定義され、ベンチマーク関数は func BenchmarkXxx(*testing.B) の形式で定義されます。これらは go test コマンドによって実行されます。

Example 関数は、Go 1.0で導入された特別なテスト形式です。func ExampleXxx() の形式で定義され、コードの利用例を示すことを目的としています。Example 関数が実行されると、その関数内で標準出力(fmt.Printfmt.Printlnなど)に出力された内容がキャプチャされます。

// Output: コメント

Example 関数の特徴的な機能の一つが、// Output: コメントです。Example 関数の本体の最後に // Output: というコメント行を記述し、その直後に期待される出力内容を記述します。

go test コマンドは、Example 関数を実行した際にキャプチャされた出力と、// Output: コメントの後に記述された期待出力を比較します。両者が完全に一致した場合のみ、テストは成功とみなされます。この機能により、コードの利用例が常に最新の出力と一致していることを保証し、ドキュメントとコードの乖離を防ぐことができます。

例えば、以下のような Example 関数があったとします。

package mypackage

import "fmt"

func ExampleHello() {
	fmt.Println("Hello, World!")
	// Output:
	// Hello, World!
}

この場合、go testExampleHello 関数が "Hello, World!" と出力することを期待します。もし // Output: の直後に改行がなく、// Output:Hello, World! のように記述されていた場合、go test が期待出力を正しくパースできない、あるいは最初の行のみを期待出力とみなしてしまうなどの問題が発生する可能性がありました。

このコミットは、まさにこの // Output: コメントのフォーマット、特に // Output: の後に改行を挟むことで、go test が期待出力を正しく認識できるようにするための修正です。

技術的詳細

このコミットの技術的な詳細は、Go言語の go test コマンドが Example 関数の // Output: コメントをどのようにパースするかという内部的な挙動に起因します。

go test は、_test.go ファイルを読み込み、Example 関数を特定します。そして、各 Example 関数のソースコードを解析し、// Output: コメントを探します。このコメントが見つかった場合、go test はそのコメントの直後からファイルの末尾、または別の // Output: コメントや関数の終了までを期待出力として読み取ります。

コミット前のコードでは、// Output: の直後に改行がない場合、go test のパーサーが期待出力を正しく認識できない、または最初の行の一部しか認識しないという問題がありました。これは、パーサーが // Output: の後に続くテキストを、コメント行の一部としてではなく、独立した出力行として扱うための内部的なロジックが、改行の存在を前提としていたためと考えられます。

具体的には、src/pkg/sort/example_interface_test.go の変更では、// Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26] のような単一行の Output コメントが、

// Output:
// [Bob: 31 John: 42 Michael: 17 Jenny: 26]

のように、// Output: の後に改行を挟む形式に修正されています。これにより、go test// Output: の次の行からを期待出力として正しく認識し、テストが意図通りに実行されるようになります。

src/pkg/sort/example_multi_test.go の変更も同様で、複数の fmt.Println の出力に対応する // Output: コメントが、それぞれ // Output: の後に改行を挟む形式に修正されています。これにより、複数行にわたる期待出力も正確に比較されるようになります。

この修正は、Goのテストフレームワークの堅牢性を高め、開発者が Example 関数をより信頼性高く利用できるようにするための、細かではあるが重要な改善です。

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

--- a/src/pkg/sort/example_interface_test.go
+++ b/src/pkg/sort/example_interface_test.go
@@ -38,6 +38,7 @@ func ExampleInterface() {
 	sort.Sort(ByAge(people))\n 	fmt.Println(people)\n \n-\t// Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26]\n+\t// Output:\n+\t// [Bob: 31 John: 42 Michael: 17 Jenny: 26]\n \t// [Michael: 17 Jenny: 26 Bob: 31 John: 42]\n }\ndiff --git a/src/pkg/sort/example_multi_test.go b/src/pkg/sort/example_multi_test.go
index b2ebc4c610..ac316540fd 100644
--- a/src/pkg/sort/example_multi_test.go
+++ b/src/pkg/sort/example_multi_test.go
@@ -122,10 +122,10 @@ func Example_sortMultiKeys() {\n \tfmt.Println(\"By language,<lines,user:\", changes)\n \n \t// Output:\n-\t//By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]\n-\t//By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]\n-\t//By user,>lines: [{dmr C 100} {glenda Go 200} {gri Go 100} {gri Smalltalk 80} {ken Go 200} {ken C 150} {r C 150} {r Go 100} {rsc Go 200}]\n-\t//By language,<lines: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}]\n-\t//By language,<lines,user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {glenda Go 200} {ken Go 200} {rsc Go 200} {gri Smalltalk 80}]\n+\t// By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]\n+\t// By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]\n+\t// By user,>lines: [{dmr C 100} {glenda Go 200} {gri Go 100} {gri Smalltalk 80} {ken Go 200} {ken C 150} {r C 150} {r Go 100} {rsc Go 200}]\n+\t// By language,<lines: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}]\n+\t// By language,<lines,user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {glenda Go 200} {ken Go 200} {rsc Go 200} {gri Smalltalk 80}]\n```

## コアとなるコードの解説

このコミットは、Go言語の `sort` パッケージ内の `example_interface_test.go` と `example_multi_test.go` という2つのテストファイルにおける `Example` 関数の `// Output:` コメントの記述方法を修正しています。

### `src/pkg/sort/example_interface_test.go` の変更点

元のコードでは、`ExampleInterface` 関数の `// Output:` コメントが以下のように記述されていました。

```go
// Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26]

このコミットにより、以下のように変更されました。

// Output:
// [Bob: 31 John: 42 Michael: 17 Jenny: 26]

変更点は、// Output: の直後に改行が追加されたことです。これにより、go test コマンドが // Output: の次の行を期待出力として正しく認識できるようになります。元の形式では、go test// Output: と同じ行にあるテキストを期待出力として認識できない、または誤って解釈する可能性がありました。

src/pkg/sort/example_multi_test.go の変更点

同様に、Example_sortMultiKeys 関数の // Output: コメントも修正されています。この関数は複数の fmt.Println ステートメントを持ち、それぞれに対応する期待出力が複数行にわたって記述されていました。

元のコードでは、各出力行の前に // Output: がなく、単にコメントとして記述されていました。

// Output:
//By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]
//By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]
//...

このコミットにより、各期待出力行の前にスペースが追加されました。

// Output:
// By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]
// By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]
//...

この変更は、// Output: の直後に改行がある場合に、その次の行の先頭にスペースがあるかないかで go test のパース挙動に影響を与える可能性があったため、一貫性を持たせるための修正と考えられます。これにより、期待出力の比較がより正確に行われるようになります。

これらの変更は、Goの Example テストが意図通りに機能し、コードの利用例が常に正しく検証されることを保証するための、重要なフォーマット修正です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード (特に src/cmd/go/internal/test/test.gosrc/testing/example.go など、go test コマンドや Example 関数の実装に関連するファイル)
  • Go言語のコミット履歴とコードレビュー (Gerrit/Go CL)
  • Stack Overflow や Go のコミュニティフォーラムでの Example 関数の利用に関する議論I have provided the detailed explanation in Markdown format to standard output as requested. I have followed all the instructions, including the chapter structure and language.
# [インデックス 17502] ファイルの概要

このコミットは、Go言語の標準ライブラリ `sort` パッケージ内のテストコードにおける `// Output:` コメントのフォーマットを修正するものです。具体的には、`go test` コマンドが期待する出力形式に合わせるため、`// Output:` の直後に改行を追加し、続く出力行が正しく認識されるように変更しています。これにより、テストの安定性と可読性が向上します。

## コミット

commit c01945afc90e17b214ccbc7d49d477075ec8b463 Author: Robert Daniel Kortschak dan.kortschak@adelaide.edu.au Date: Sun Sep 8 13:21:03 2013 +1000

sort: fix up example expected output formatting

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/13426046

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

[https://github.com/golang/go/commit/c01945afc90e17b214ccbc7d49d477075ec8b463](https://github.com/golang/go/commit/c01945afc90e17b214ccbc7d49d477075ec8b463)

## 元コミット内容

sort: fix up example expected output formatting

R=golang-dev, r CC=golang-dev https://golang.org/cl/13426046


## 変更の背景

Go言語のテストフレームワークには、`Example` 関数という特殊なテスト形式が存在します。これは、コードの利用例を示すと同時に、その出力が期待されるものと一致するかを検証するものです。`Example` 関数内で `fmt.Println` などで出力された内容は、関数の末尾に記述された `// Output:` コメントの後に続く行と比較されます。

このコミットが行われた2013年9月時点では、`go test` コマンドが `// Output:` コメントの直後に続く行を期待出力として認識する際に、`// Output:` と出力内容の間に改行がないと正しくパースできない、あるいは意図しない挙動を示す可能性がありました。

このコミットは、`src/pkg/sort/example_interface_test.go` と `src/pkg/sort/example_multi_test.go` の `Example` 関数において、`// Output:` コメントの直後に改行が欠けていたために、テストが正しく機能しない、または将来的に問題を引き起こす可能性があったため、そのフォーマットを修正することを目的としています。これにより、`go test` が期待出力を正確に読み取り、テストの信頼性を確保します。

## 前提知識の解説

### Go言語のテストとExample関数

Go言語には、標準で強力なテストフレームワークが組み込まれています。テストファイルは通常、テスト対象のGoファイルと同じディレクトリに `_test.go` というサフィックスを付けて配置されます。

テスト関数は `func TestXxx(*testing.T)` の形式で定義され、ベンチマーク関数は `func BenchmarkXxx(*testing.B)` の形式で定義されます。これらは `go test` コマンドによって実行されます。

`Example` 関数は、Go 1.0で導入された特別なテスト形式です。`func ExampleXxx()` の形式で定義され、コードの利用例を示すことを目的としています。`Example` 関数が実行されると、その関数内で標準出力(`fmt.Print`、`fmt.Println`など)に出力された内容がキャプチャされます。

### `// Output:` コメント

`Example` 関数の特徴的な機能の一つが、`// Output:` コメントです。`Example` 関数の本体の最後に `// Output:` というコメント行を記述し、その直後に期待される出力内容を記述します。

`go test` コマンドは、`Example` 関数を実行した際にキャプチャされた出力と、`// Output:` コメントの後に記述された期待出力を比較します。両者が完全に一致した場合のみ、テストは成功とみなされます。この機能により、コードの利用例が常に最新の出力と一致していることを保証し、ドキュメントとコードの乖離を防ぐことができます。

例えば、以下のような `Example` 関数があったとします。

```go
package mypackage

import "fmt"

func ExampleHello() {
	fmt.Println("Hello, World!")
	// Output:
	// Hello, World!
}

この場合、go testExampleHello 関数が "Hello, World!" と出力することを期待します。もし // Output: の直後に改行がなく、// Output:Hello, World! のように記述されていた場合、go test が期待出力を正しくパースできない、あるいは最初の行のみを期待出力とみなしてしまうなどの問題が発生する可能性がありました。

このコミットは、まさにこの // Output: コメントのフォーマット、特に // Output: の後に改行を挟むことで、go test が期待出力を正しく認識できるようにするための修正です。

技術的詳細

このコミットの技術的な詳細は、Go言語の go test コマンドが Example 関数の // Output: コメントをどのようにパースするかという内部的な挙動に起因します。

go test は、_test.go ファイルを読み込み、Example 関数を特定します。そして、各 Example 関数のソースコードを解析し、// Output: コメントを探します。このコメントが見つかった場合、go test はそのコメントの直後からファイルの末尾、または別の // Output: コメントや関数の終了までを期待出力として読み取ります。

コミット前のコードでは、// Output: の直後に改行がない場合、go test のパーサーが期待出力を正しく認識できない、または最初の行の一部しか認識しないという問題がありました。これは、パーサーが // Output: の後に続くテキストを、コメント行の一部としてではなく、独立した出力行として扱うための内部的なロジックが、改行の存在を前提としていたためと考えられます。

具体的には、src/pkg/sort/example_interface_test.go の変更では、// Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26] のような単一行の Output コメントが、

// Output:
// [Bob: 31 John: 42 Michael: 17 Jenny: 26]

のように、// Output: の後に改行を挟む形式に修正されています。これにより、go test// Output: の次の行からを期待出力として正しく認識し、テストが意図通りに実行されるようになります。

src/pkg/sort/example_multi_test.go の変更も同様で、複数の fmt.Println の出力に対応する // Output: コメントが、それぞれ // Output: の後に改行を挟む形式に修正されています。これにより、複数行にわたる期待出力も正確に比較されるようになります。

この修正は、Goのテストフレームワークの堅牢性を高め、開発者が Example 関数をより信頼性高く利用できるようにするための、細かではあるが重要な改善です。

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

--- a/src/pkg/sort/example_interface_test.go
+++ b/src/pkg/sort/example_interface_test.go
@@ -38,6 +38,7 @@ func ExampleInterface() {
 	sort.Sort(ByAge(people))\n 	fmt.Println(people)\n \n-\t// Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26]\n+\t// Output:\n+\t// [Bob: 31 John: 42 Michael: 17 Jenny: 26]\n \t// [Michael: 17 Jenny: 26 Bob: 31 John: 42]\n }\ndiff --git a/src/pkg/sort/example_multi_test.go b/src/pkg/sort/example_multi_test.go
index b2ebc4c610..ac316540fd 100644
--- a/src/pkg/sort/example_multi_test.go
+++ b/src/pkg/sort/example_multi_test.go
@@ -122,10 +122,10 @@ func Example_sortMultiKeys() {\n \tfmt.Println(\"By language,<lines,user:\", changes)\n \n \t// Output:\n-\t//By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]\n-\t//By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]\n-\t//By user,>lines: [{dmr C 100} {glenda Go 200} {gri Go 100} {gri Smalltalk 80} {ken Go 200} {ken C 150} {r C 150} {r Go 100} {rsc Go 200}]\n-\t//By language,<lines: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}]\n-\t//By language,<lines,user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {glenda Go 200} {ken Go 200} {rsc Go 200} {gri Smalltalk 80}]\n+\t// By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]\n+\t// By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]\n+\t// By user,>lines: [{dmr C 100} {glenda Go 200} {gri Go 100} {gri Smalltalk 80} {ken Go 200} {ken C 150} {r C 150} {r Go 100} {rsc Go 200}]\n+\t// By language,<lines: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}]\n+\t// By language,<lines,user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {glenda Go 200} {ken Go 200} {rsc Go 200} {gri Smalltalk 80}]\n```

## コアとなるコードの解説

このコミットは、Go言語の `sort` パッケージ内の `example_interface_test.go` と `example_multi_test.go` という2つのテストファイルにおける `Example` 関数の `// Output:` コメントの記述方法を修正しています。

### `src/pkg/sort/example_interface_test.go` の変更点

元のコードでは、`ExampleInterface` 関数の `// Output:` コメントが以下のように記述されていました。

```go
// Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26]

このコミットにより、以下のように変更されました。

// Output:
// [Bob: 31 John: 42 Michael: 17 Jenny: 26]

変更点は、// Output: の直後に改行が追加されたことです。これにより、go test コマンドが // Output: の次の行を期待出力として正しく認識できるようになります。元の形式では、go test// Output: と同じ行にあるテキストを期待出力として認識できない、または誤って解釈する可能性がありました。

src/pkg/sort/example_multi_test.go の変更点

同様に、Example_sortMultiKeys 関数の // Output: コメントも修正されています。この関数は複数の fmt.Println ステートメントを持ち、それぞれに対応する期待出力が複数行にわたって記述されていました。

元のコードでは、各出力行の前に // Output: がなく、単にコメントとして記述されていました。

// Output:
//By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}]
//By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]
//...

このコミットにより、各期待出力行の前にスペースが追加されました。

// Output:
// By user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}]
// By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}]
//...

この変更は、// Output: の直後に改行がある場合に、その次の行の先頭にスペースがあるかないかで go test のパース挙動に影響を与える可能性があったため、一貫性を持たせるための修正と考えられます。これにより、期待出力の比較がより正確に行われるようになります。

これらの変更は、Goの Example テストが意図通りに機能し、コードの利用例が常に正しく検証されることを保証するための、重要なフォーマット修正です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード (特に src/cmd/go/internal/test/test.gosrc/testing/example.go など、go test コマンドや Example 関数の実装に関連するファイル)
  • Go言語のコミット履歴とコードレビュー (Gerrit/Go CL)
  • Stack Overflow や Go のコミュニティフォーラムでの Example 関数の利用に関する議論