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