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

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

このコミットは、Go言語の標準ライブラリであるlogパッケージのテストコード(example_test.go)における出力例の修正です。具体的には、テストの期待される出力に含まれるファイル名と行番号の表示が、実際の出力と一致するように行番号を1行ずらす変更を行っています。これにより、ビルドエラーを修正し、テストが正しく機能するようにしています。

コミット

commit 9f2b2dfa8644a1c110579b00e91c72848ddfc478
Author: Andrew Gerrand <adg@golang.org>
Date:   Wed Dec 18 17:25:23 2013 +1100

    log: fix example (fix build)
    
    R=golang-dev
    CC=golang-dev
    https://golang.org/cl/43780043

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

https://github.com/golang/go/commit/9f2b2dfa8644a1c110579b00e91c72848ddfc478

元コミット内容

log: fix example (fix build)

R=golang-dev
CC=golang-dev
https://golang.org/cl/43780043

変更の背景

このコミットは、「ビルドの修正 (fix build)」を目的としています。Go言語のテストフレームワークでは、Example関数が提供されており、その関数の出力が特定のコメント(// Output:)に続く内容と一致するかどうかを検証する機能があります。もし実際の出力と期待される出力が一致しない場合、テストは失敗し、ビルドプロセスが中断されることがあります。

このケースでは、src/pkg/log/example_test.goファイル内のExampleLogger関数において、logパッケージが出力するログメッセージの行番号が、何らかの先行するコード変更によって1行ずれてしまったと考えられます。その結果、テストの期待出力(// Output:コメントに記述された内容)と実際の出力が不一致となり、ビルドが失敗する状態になっていました。このコミットは、その不一致を解消し、ビルドが再び成功するようにするための修正です。

前提知識の解説

Go言語のlogパッケージ

Go言語の標準ライブラリであるlogパッケージは、シンプルなロギング機能を提供します。プログラムの実行中に情報を出力するために使用され、エラーメッセージ、デバッグ情報、イベントログなどを記録するのに役立ちます。log.New関数を使ってカスタムロガーを作成したり、log.SetFlagsで出力形式(タイムスタンプ、ファイル名、行番号など)を制御したりできます。

Go言語のExampleテスト

Go言語には、通常のユニットテスト(TestXxx関数)やベンチマークテスト(BenchmarkXxx関数)に加えて、Exampleテストというユニークな機能があります。Exampleテストは、コードの利用例を示すためのもので、ドキュメント生成やテストの一部として機能します。

Example関数は、func ExampleXxx()という形式で定義され、その関数内で標準出力に書き込まれた内容が、関数内の// Output:コメントに続く内容と一致するかどうかをGoのテストツールが自動的に検証します。この機能は、コードの動作例を常に最新かつ正確に保つために非常に有用です。もしコードの変更によって出力が変わった場合、Exampleテストは失敗し、開発者にその変更を通知します。

example_test.goファイル

Goのパッケージには、そのパッケージの利用例を示すためのexample_test.goという慣習的なファイル名がよく使われます。このファイルには、パッケージ内の関数や型のExampleテストが記述され、go docコマンドで生成されるドキュメントにも組み込まれます。

技術的詳細

このコミットの技術的な詳細は、Goのlogパッケージがログメッセージに含めるファイル名と行番号の挙動、そしてExampleテストの出力検証メカニズムに集約されます。

logパッケージのデフォルトのフラグ設定には、LshortfileまたはLlongfileが含まれる場合、ログメッセージのプレフィックスとして呼び出し元のファイル名と行番号が付加されます。例えば、logger: example_test.go:15: Hello, log file!という出力は、example_test.goファイルの15行目でログが出力されたことを示しています。

ExampleLogger関数は、log.Newで新しいロガーを作成し、log.Lshortfileフラグを設定しています。これにより、ログメッセージにはファイル名と短いパス(example_test.go)と行番号が含まれるようになります。

func ExampleLogger() {
	var buf bytes.Buffer
	logger := log.New(&buf, "logger: ", log.Lshortfile)
	logger.Print("Hello, log file!")

	fmt.Print(&buf)
	// Output:
	// logger: example_test.go:15: Hello, log file! // <-- 注目すべき行
}

このコミットが行われた時点では、ExampleLogger関数内のlogger.Print("Hello, log file!")が実行される実際の行番号が16行目になっていました。しかし、// Output:コメントでは15行目と記述されていたため、テストが失敗していました。

この修正は、// Output:コメント内の期待される行番号を15から16に変更することで、実際の出力と期待される出力の不一致を解消しています。これは、ExampleLogger関数の定義やその周辺のコードに、以前のコミットで1行の追加または削除があったために、相対的な行番号がずれたことが原因と考えられます。

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

--- a/src/pkg/log/example_test.go
+++ b/src/pkg/log/example_test.go
@@ -17,5 +17,5 @@ func ExampleLogger() {
 
 	fmt.Print(&buf)
 	// Output:
-	// logger: example_test.go:15: Hello, log file!
+	// logger: example_test.go:16: Hello, log file!
 }

コアとなるコードの解説

変更はsrc/pkg/log/example_test.goファイル内のExampleLogger関数に限定されています。

元のコードでは、ExampleLogger関数の末尾にある// Output:コメントの行が以下のようになっていました。

// logger: example_test.go:15: Hello, log file!

これは、logger.Print("Hello, log file!")example_test.goファイルの15行目で実行され、その結果としてlogパッケージがlogger: example_test.go:15: Hello, log file!という形式のログを出力することを期待していました。

しかし、このコミットの時点で、実際のlogger.Printの呼び出しはファイルの16行目に位置していました。そのため、logパッケージはlogger: example_test.go:16: Hello, log file!というログを出力していました。

この不一致を解消するため、コミットでは// Output:コメントの行番号を15から16に修正しています。

// logger: example_test.go:16: Hello, log file!

この変更により、Exampleテストは実際の出力と期待される出力が一致するようになり、ビルドが正常に完了するようになりました。これは、Goのテストシステムが非常に厳密に// Output:コメントの内容を検証していることを示しています。

関連リンク

参考にした情報源リンク