[インデックス 17874] ファイルの概要
このコミットは、Go言語のドキュメンテーションツールであるgodoc
が、パッケージレベルのExample関数を適切に認識し、ドキュメントとして表示するように改善するものです。具体的には、src/pkg/testing/testing.go
ファイル内のExample関数の命名規則に関するコメントが更新され、パッケージレベルのExample関数(func Example() { ... }
)が明示的に記述されるようになりました。
コミット
commit 8f10c76471156ea2165816edcd370e290f420753
Author: Olivier Duperray <duperray.olivier@gmail.com>
Date: Mon Nov 11 12:09:24 2013 +1100
cmd/godoc: document package-level examples
Fixes issue 5807 .
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/23940043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8f10c76471156ea2165816edcd370e290f420753
元コミット内容
cmd/godoc: document package-level examples
Fixes issue 5807.
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/23940043
このコミットメッセージは、godoc
コマンドがパッケージレベルのExample関数をドキュメント化するように修正されたことを示しています。これはGoのIssue 5807を解決するものです。
変更の背景
Go言語では、コードのExample(使用例)をテストコードと同じファイル内に記述し、godoc
ツールがそれを自動的に抽出し、生成されるドキュメントに含める機能があります。これにより、コードの機能と使用方法を同時に示すことができ、ドキュメントの鮮度と正確性を保つことができます。
しかし、このコミット以前は、godoc
が認識するExample関数の命名規則に関するドキュメント(src/pkg/testing/testing.go
内のコメント)に、パッケージ全体に対するExample関数(func Example() { ... }
)の記述が欠けていました。そのため、開発者がパッケージレベルのExample関数を記述しても、godoc
がそれを適切にドキュメントとして扱わない、あるいはその存在が公式ドキュメントで明示されていないという問題がありました。
Issue 5807は、このドキュメントの不足を指摘し、パッケージレベルのExample関数がgodoc
によって認識されるべきであり、その命名規則が明示されるべきであるという要望を提起していました。このコミットは、その要望に応える形で、testing
パッケージ内のコメントを更新し、godoc
のExample処理の仕様をより明確にすることを目的としています。
前提知識の解説
Go言語のExample関数とgodoc
Go言語には、コードのExampleを記述するための特別な機能があります。これはtesting
パッケージと密接に関連しており、テストファイル(通常は_test.go
で終わるファイル)内にExample
というプレフィックスを持つ関数を定義することで実現されます。
-
Example関数の命名規則:
func Example()
: パッケージ全体のExample。func ExampleF()
: 関数F
のExample。func ExampleT()
: 型T
のExample。func ExampleT_M()
: 型T
のメソッドM
のExample。- 複数のExampleを記述する場合は、
func Example_suffix()
のようにアンダースコアと小文字のサフィックスを追加できます(例:func ExampleF_suffix()
)。
-
godoc
: Go言語のソースコードからドキュメントを生成するツールです。godoc
は、Goのソースコード内のコメント、関数シグネチャ、型定義などを解析し、HTML形式のドキュメントを生成します。特に、Example関数はgodoc
によって自動的に抽出され、そのExampleコードと実行結果(Example関数内の// Output:
コメントに記述されたもの)がドキュメントに表示されます。これにより、ユーザーはコードの動作を実際に確認しながらドキュメントを読むことができます。 -
go test
:go test
コマンドは、Example関数も実行します。Example関数に// Output:
コメントが含まれている場合、go test
はそのExampleを実行し、標準出力が// Output:
コメントの内容と一致するかどうかを検証します。これにより、Exampleコードが常に最新の動作を反映していることが保証されます。
src/pkg/testing/testing.go
このファイルは、Go言語の標準ライブラリであるtesting
パッケージのコア部分を定義しています。testing
パッケージは、Goプログラムのテストとベンチマークをサポートするための機能を提供します。Example関数に関するコメントは、このファイル内に記述されており、Example関数の命名規則やgodoc
による処理のされ方について説明しています。
技術的詳細
このコミットの技術的な変更は、src/pkg/testing/testing.go
ファイル内のコメントの修正に限定されています。しかし、その影響はgodoc
ツールがExample関数をどのように解釈し、表示するかに及びます。
godoc
は、Goのソースコードを解析する際に、testing
パッケージのドキュメントに記述されているExample関数の命名規則を内部的に参照しています。このコミット以前は、testing.go
のコメントには、関数、型、メソッドに対するExample関数の命名規則は記述されていましたが、パッケージ全体に対するExample関数(func Example() { ... }
)については明示されていませんでした。
この変更により、testing.go
のコメントにfunc Example() { ... }
が追加されたことで、godoc
の内部ロジックがこの命名規則をより明確に認識し、パッケージレベルのExampleも適切にドキュメントに含めることができるようになりました。これは、godoc
がExample関数を識別するために、ソースコードのAST(抽象構文木)を解析し、特定の命名パターンを持つ関数を探すためです。コメントの更新は、この解析ロジックの「仕様書」としての役割を果たします。
また、Example関数に// Output:
コメントを付与することで、そのExampleが実行可能であり、go test
によって検証されるべきであることが示されます。このコミットは、このOutput
コメントの動作には直接影響を与えませんが、Example関数の命名規則の完全性を高めることで、開発者がより包括的なExampleを記述しやすくなります。
コアとなるコードの変更箇所
--- a/src/pkg/testing/testing.go
+++ b/src/pkg/testing/testing.go
@@ -73,17 +73,19 @@
//
// Example functions without output comments are compiled but not executed.
//
-// The naming convention to declare examples for a function F, a type T and
+// The naming convention to declare examples for the package, a function F, a type T and
// method M on type T are:
//
+// func Example() { ... }
// func ExampleF() { ... }
// func ExampleT() { ... }
// func ExampleT_M() { ... }
//
-// Multiple example functions for a type/function/method may be provided by
+// Multiple example functions for a package/type/function/method may be provided by
// appending a distinct suffix to the name. The suffix must start with a
// lower-case letter.
//
+// func Example_suffix() { ... }
// func ExampleF_suffix() { ... }
// func ExampleT_suffix() { ... }
// func ExampleT_M_suffix() { ... }
コアとなるコードの解説
変更はsrc/pkg/testing/testing.go
ファイル内のコメント部分にあります。
-
変更前:
// The naming convention to declare examples for a function F, a type T and // method M on type T are: // // func ExampleF() { ... } // func ExampleT() { ... } // func ExampleT_M() { ... }
この部分では、関数、型、メソッドに対するExample関数の命名規則が説明されていました。
-
変更後:
// The naming convention to declare examples for the package, a function F, a type T and // method M on type T are: // // func Example() { ... } // func ExampleF() { ... } // func ExampleT() { ... } // func ExampleT_M() { ... }
最初の行が「
The naming convention to declare examples for the package, a function F, a type T and
」と変更され、「the package
」が追加されました。 そして、新たに「func Example() { ... }
」という行が追加され、パッケージレベルのExample関数の命名規則が明示されました。 -
変更前:
// Multiple example functions for a type/function/method may be provided by // appending a distinct suffix to the name. The suffix must start with a // lower-case letter. // // func ExampleF_suffix() { ... } // func ExampleT_suffix() { ... } // func ExampleT_M_suffix() { ... }
この部分では、複数のExample関数を定義する際のサフィックスの規則が説明されていました。
-
変更後:
// Multiple example functions for a package/type/function/method may be provided by // appending a distinct suffix to the name. The suffix must start with a // lower-case letter. // // func Example_suffix() { ... } // func ExampleF_suffix() { ... } // func ExampleT_suffix() { ... } // func ExampleT_M_suffix() { ... }
最初の行が「
Multiple example functions for a package/type/function/method may be provided by
」と変更され、「package/
」が追加されました。 そして、新たに「func Example_suffix() { ... }
」という行が追加され、パッケージレベルのExample関数にサフィックスを付ける場合の命名規則が明示されました。
これらの変更は、GoのExample関数のドキュメントにおける包括性を高め、開発者がパッケージ全体に対するExampleを記述する際の指針を明確にすることを目的としています。これにより、godoc
が生成するドキュメントがより完全なものとなり、Goのコードベースの理解が深まります。
関連リンク
- Go Issue 5807: https://github.com/golang/go/issues/5807
- Go CL 23940043: https://golang.org/cl/23940043
参考にした情報源リンク
- Go言語の公式ドキュメント(
go doc
コマンドやtesting
パッケージに関する情報) - Go言語のExample関数に関するブログ記事やチュートリアル
godoc
ツールの動作原理に関する情報- Go言語のIssueトラッカー(Issue 5807の内容)
- Go言語のコードレビューシステム(CL 23940043の内容)
- https://pkg.go.dev/testing (Go
testing
パッケージの公式ドキュメント) - https://go.dev/blog/examples (Go Blog: Example Functions)
- https://go.dev/cmd/godoc/ (Go
godoc
コマンドの公式ドキュメント) - https://go.dev/doc/effective_go#examples (Effective Go: Examples)