[インデックス 10972] ファイルの概要
このコミットは、Go言語の標準ライブラリであるtestingパッケージ内のLog関数のコメントを修正するものです。具体的には、Log関数のフォーマット動作がfmt.Print()ではなくfmt.Println()に類似していることを明確にするための変更です。
コミット
commit b5216e2e559a585a424fa3eb28c0e158fe79a75b
Author: Robert Hencke <robert.hencke@gmail.com>
Date: Thu Dec 22 10:05:51 2011 -0800
testing: compare Log to Println
Log always adds spaces between operands, like Println but unlike Print
R=golang-dev
CC=golang-dev
https://golang.org/cl/5504069
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/b5216e2e559a585a424fa3eb28c0e158fe79a75b
元コミット内容
testing: compare Log to Println
このコミットの目的は、testingパッケージのLog関数が、引数間にスペースを追加する点でfmt.Printlnに似ており、fmt.Printとは異なることを明確にすることです。
変更の背景
Go言語のfmtパッケージには、文字列のフォーマットと出力を行うためのいくつかの関数があります。その中でもfmt.Printとfmt.Printlnはよく使われますが、その挙動には重要な違いがあります。
fmt.Print(a ...interface{}) (n int, err error): 引数をデフォルトのフォーマットで出力します。引数間にスペースは追加されません。fmt.Println(a ...interface{}) (n int, err error): 引数をデフォルトのフォーマットで出力し、各引数間にスペースを追加し、最後に改行を追加します。
testingパッケージのLog関数は、テスト中に情報をログに出力するために使用されます。この関数は内部的にfmt.Sprintln(fmt.Printlnと同様に引数間にスペースを追加し、最後に改行を追加するが、文字列として返す関数)を使用しています。しかし、以前のコメントではLog関数がPrint()に類似していると記述されており、これが誤解を招く可能性がありました。
このコミットは、Log関数の実際の動作とコメントの記述との間の不一致を解消し、開発者がLog関数の挙動を正しく理解できるようにするために行われました。
前提知識の解説
Go言語のfmtパッケージ
fmtパッケージは、Go言語におけるフォーマットI/Oを実装するためのパッケージです。C言語のprintfやscanfに似た機能を提供しますが、Goのインターフェースの概念に基づいて設計されています。
fmt.Print系関数: 引数をスペースで区切らずに出力します。fmt.Println系関数: 引数をスペースで区切り、最後に改行を追加して出力します。fmt.Printf系関数: フォーマット文字列に基づいて引数を整形して出力します。
これらの関数は、それぞれPrint、Println、Printfという接尾辞を持つバリアント(例: Fprint, Sprint, Errorfなど)が存在し、出力先や戻り値の形式が異なります。
Go言語のtestingパッケージ
testingパッケージは、Go言語で自動テストを記述するためのフレームワークを提供します。テスト関数はTestで始まる名前を持ち、*testing.T型の引数を取ります。
*testing.T: テストの実行状態を管理し、テストの失敗を報告したり、ログを出力したりするためのメソッドを提供します。t.Log(args ...interface{}): テスト中に情報をログに出力するために使用されます。この関数で出力された内容は、テストが失敗した場合や、go test -vオプションが指定された場合に表示されます。
技術的詳細
このコミットの技術的な変更は非常にシンプルで、src/pkg/testing/testing.goファイル内の1行のコメント修正に限定されます。
変更前:
// Log formats its arguments using default formatting, analogous to Print(),
変更後:
// Log formats its arguments using default formatting, analogous to Println(),
この変更は、Log関数の内部実装がfmt.Sprintln(args...)を使用していることと整合性を取るためのものです。fmt.Sprintlnは、fmt.Printlnと同様に、与えられた引数をスペースで区切り、最後に改行を追加して文字列を生成します。したがって、Log関数の動作はPrint()よりもPrintln()に類似しているという記述がより正確です。
この修正は、コードの動作自体には影響を与えませんが、ドキュメントの正確性を向上させ、開発者がLog関数の挙動について誤解する可能性を減らします。特に、引数が複数ある場合にスペースが自動的に追加されるというPrintln系の関数の特性を明確にしています。
コアとなるコードの変更箇所
変更はsrc/pkg/testing/testing.goファイルの一箇所のみです。
--- a/src/pkg/testing/testing.go
+++ b/src/pkg/testing/testing.go
@@ -147,7 +147,7 @@ func (c *common) log(s string) {
c.output = append(c.output, decorate(s, true)...)
}
-// Log formats its arguments using default formatting, analogous to Print(),
+// Log formats its arguments using default formatting, analogous to Println(),
// and records the text in the error log.
func (c *common) Log(args ...interface{}) { c.log(fmt.Sprintln(args...)) }
コアとなるコードの解説
変更された行は、testingパッケージのcommon構造体(*testing.Tや*testing.Bの基盤となる構造体)のLogメソッドに対するコメントです。
元のコメントでは、Log関数がPrint()に類似していると説明されていました。しかし、Log関数の実装を見ると、内部でfmt.Sprintln(args...)を呼び出しています。
fmt.Sprintlnは、fmt.Printlnと同様に、引数間にスペースを自動的に挿入し、最後に改行を追加します。一方、fmt.Printは引数間にスペースを挿入しません。
例えば:
fmt.Print("hello", "world")は"helloworld"を出力します。fmt.Println("hello", "world")は"hello world\n"を出力します。
testing.T.Log("hello", "world") を実行すると、内部でfmt.Sprintln("hello", "world")が呼ばれるため、出力は "hello world\n" となります。この挙動はfmt.Printlnに類似しているため、コメントをPrintln()に修正することで、Log関数の実際の動作がより正確に反映されるようになりました。
この変更は、コードの機能的な動作には影響を与えず、単にドキュメントの正確性を向上させるものです。
関連リンク
- Go言語の
fmtパッケージのドキュメント: https://pkg.go.dev/fmt - Go言語の
testingパッケージのドキュメント: https://pkg.go.dev/testing
参考にした情報源リンク
- Go言語の公式ドキュメント
- コミットメッセージと差分情報
- Go言語のソースコード (
src/pkg/testing/testing.go)