[インデックス 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:
コメントの内容を検証していることを示しています。
関連リンク
- Go CL (Code Review) へのリンク: https://golang.org/cl/43780043
参考にした情報源リンク
- Go言語
log
パッケージのドキュメント: https://pkg.go.dev/log - Go言語
testing
パッケージのドキュメント (Example functionsについて): https://pkg.go.dev/testing#hdr-Examples - Go言語のテストに関する公式ブログ記事など (一般的な情報源として)