[インデックス 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
)