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

[インデックス 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.Printfmt.Printlnはよく使われますが、その挙動には重要な違いがあります。

  • fmt.Print(a ...interface{}) (n int, err error): 引数をデフォルトのフォーマットで出力します。引数間にスペースは追加されません。
  • fmt.Println(a ...interface{}) (n int, err error): 引数をデフォルトのフォーマットで出力し、各引数間にスペースを追加し、最後に改行を追加します。

testingパッケージのLog関数は、テスト中に情報をログに出力するために使用されます。この関数は内部的にfmt.Sprintlnfmt.Printlnと同様に引数間にスペースを追加し、最後に改行を追加するが、文字列として返す関数)を使用しています。しかし、以前のコメントではLog関数がPrint()に類似していると記述されており、これが誤解を招く可能性がありました。

このコミットは、Log関数の実際の動作とコメントの記述との間の不一致を解消し、開発者がLog関数の挙動を正しく理解できるようにするために行われました。

前提知識の解説

Go言語のfmtパッケージ

fmtパッケージは、Go言語におけるフォーマットI/Oを実装するためのパッケージです。C言語のprintfscanfに似た機能を提供しますが、Goのインターフェースの概念に基づいて設計されています。

  • fmt.Print系関数: 引数をスペースで区切らずに出力します。
  • fmt.Println系関数: 引数をスペースで区切り、最後に改行を追加して出力します。
  • fmt.Printf系関数: フォーマット文字列に基づいて引数を整形して出力します。

これらの関数は、それぞれPrintPrintlnPrintfという接尾辞を持つバリアント(例: 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言語の公式ドキュメント
  • コミットメッセージと差分情報
  • Go言語のソースコード (src/pkg/testing/testing.go)