[インデックス 10618] ファイルの概要
このコミットは、Go言語のドキュメンテーションツールであるgodoc
の表示順序に関する変更です。具体的には、型(type)に関連するサンプルコード(examples)の表示位置を、その型に属する定数(constants)や変数(variables)のセクションの後に移動させることで、ドキュメントの可読性と論理的な流れを改善しています。
コミット
commit af848926431da0345fd78c0dba0a513df44ee1cf
Author: Volker Dobler <dr.volker.dobler@gmail.com>
Date: Tue Dec 6 10:52:43 2011 +1100
godoc: Show type examples between variables and methods.
Fixes #2466.
R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5451094
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/af848926431da0345fd78c0dba0a513df44ee1cf
元コミット内容
godoc: Show type examples between variables and methods.
このコミットは、godoc
が生成するドキュメントにおいて、型に関連するサンプルコード(examples)の表示位置を調整するものです。具体的には、型に属する変数や定数のセクションと、メソッドやファクトリ関数のセクションの間にサンプルコードを表示するように変更します。これにより、関連する情報がより論理的に配置され、ドキュメントの理解が容易になります。
この変更は、GoのIssue #2466を修正するものです。
変更の背景
Go言語の公式ドキュメンテーションツールであるgodoc
は、Goのソースコードから自動的にドキュメントを生成します。このドキュメントは、パッケージ、型、関数、変数などの要素について詳細な情報を提供し、特にサンプルコード(Examples)は、その要素の利用方法を具体的に示す上で非常に重要です。
このコミットが行われる前は、型に関連するサンプルコードは、型の宣言とドキュメントの直後に表示されていました。しかし、型にはその型に属する定数や変数も存在し、それらの情報も型のドキュメントの一部として重要です。サンプルコードが型の宣言直後に表示されると、定数や変数のセクションよりも前に来てしまい、ドキュメント全体の流れが不自然になる可能性がありました。
Issue #2466("godoc: type examples should appear after variables")は、この表示順序の問題を指摘しています。ユーザーは、型の定数や変数が先に表示され、その後に型全体の利用例としてのサンプルコードが続く方が、より自然で理解しやすいと感じていました。この変更は、このフィードバックに応え、godoc
が生成するドキュメントの論理的な構造と可読性を向上させることを目的としています。
前提知識の解説
godoc
godoc
は、Go言語のソースコードからドキュメンテーションを生成し、Webブラウザで表示するためのツールです。Goのコードに記述されたコメント(特にエクスポートされた識別子に付随するコメント)や、Example
関数として記述されたサンプルコードを解析し、整形されたHTMLドキュメントとして提供します。開発者はgodoc
を使うことで、コードとドキュメントを密接に連携させ、常に最新のドキュメントを維持することができます。
Go言語のExamples
Go言語では、パッケージや型、関数などの利用例をExample
関数として記述することができます。これらの関数は、_test.go
ファイル内にExample<Name>
という命名規則で定義され、godoc
によって自動的に検出され、生成されるドキュメントに組み込まれます。Example
関数は、単なるコードスニペットではなく、実際にテストとして実行可能であり、出力が期待通りであるかを検証することもできます。これにより、ドキュメントのサンプルコードが常に正しく動作することを保証します。
Goテンプレート (text/template, html/template)
godoc
は、Goの標準ライブラリであるhtml/template
パッケージを使用してHTMLドキュメントを生成します。html/template
は、Goのデータ構造をHTMLにレンダリングするためのテンプレートエンジンです。テンプレートファイル(例: package.html
)には、プレースホルダー({{.Field}}
)や制御構造({{range .Slice}}
, {{if .Condition}}
)が記述されており、godoc
はこれらのテンプレートに解析したGoのコード情報を流し込むことで最終的なHTMLを生成します。
このコミットで変更されているpackage.html
は、Goパッケージのドキュメントページを生成するためのテンプレートファイルです。
技術的詳細
このコミットの技術的な変更は、godoc
が使用するHTMLテンプレートファイルlib/godoc/package.html
内の特定の行の移動に集約されます。
package.html
は、Goパッケージのドキュメントページをレンダリングするためのテンプレートです。このテンプレートは、パッケージ内の型、関数、変数、定数などを表示するための構造を定義しています。
変更前は、型の定義(type <name>
)とドキュメント(comment_html .Doc
)、そしてその型の宣言コード(node_html .Decl $.FSet
)の直後に、型に関連するサンプルコード(example_html $tname $.Examples $.FSet
)が表示されていました。
<!-- 変更前の一部 -->
<h2 id="{{$tname_html}}">type <a href="/{{posLink_url .Decl $.FSet}}">{{$tname_html}}</a></h2>
{{comment_html .Doc}}
<p><pre>{{node_html .Decl $.FSet}}</pre></p>
{{example_html $tname $.Examples $.FSet}} <!-- ここにあった -->
{{range .Consts}}
{{comment_html .Doc}}
<pre>{{node_html .Decl $.FSet}}</pre>
{{end}}
{{range .Vars}}
{{comment_html .Doc}}
<pre>{{node_html .Decl $.FSet}}</pre>
{{end}}
このコミットでは、{{example_html $tname $.Examples $.FSet}}
の行が、型の定数(Consts
)と変数(Vars
)のセクションの後に移動されました。
<!-- 変更後の一部 -->
<h2 id="{{$tname_html}}">type <a href="/{{posLink_url .Decl $.FSet}}">{{$tname_html}}</a></h2>
{{comment_html .Doc}}
<p><pre>{{node_html .Decl $.FSet}}</pre></p>
{{range .Consts}}
{{comment_html .Doc}}
<pre>{{node_html .Decl $.FSet}}</pre>
{{end}}
{{range .Vars}}
{{comment_html .Doc}}
<pre>{{node_html .Decl $.FSet}}</pre>
{{end}}
{{example_html $tname $.Examples $.FSet}} <!-- ここに移動した -->
{{range .Factories}}
{{$name_html := html .Name}}
<h3 id="{{$name_html}}">func <a href="/{{posLink_url .Decl $.FSet}}">{{$name_html}}</a></h3>
この変更により、godoc
が生成するHTMLドキュメントでは、型の概要、その型に属する定数、変数、そして最後にその型全体の利用例としてのサンプルコードが順に表示されるようになります。これは、読者が型の基本的な構成要素を理解した上で、その型がどのように使われるのかを学ぶという、より自然な学習フローを提供します。
コアとなるコードの変更箇所
変更はlib/godoc/package.html
ファイルの一箇所のみです。
--- a/lib/godoc/package.html
+++ b/lib/godoc/package.html
@@ -89,7 +89,6 @@
<h2 id="{{$tname_html}}">type <a href="/{{posLink_url .Decl $.FSet}}">{{$tname_html}}</a></h2>
{{comment_html .Doc}}
<p><pre>{{node_html .Decl $.FSet}}</pre></p>
-\t\t{{example_html $tname $.Examples $.FSet}}\n
{{range .Consts}}\n
\t\t\t{{comment_html .Doc}}\n
\t\t\t<pre>{{node_html .Decl $.FSet}}</pre>\n
@@ -98,6 +97,7 @@
\t\t\t{{comment_html .Doc}}\n
\t\t\t<pre>{{node_html .Decl $.FSet}}</pre>\n
\t\t{{end}}\n
+\t\t{{example_html $tname $.Examples $.FSet}}\n
{{range .Factories}}\n
\t\t\t{{$name_html := html .Name}}\n
\t\t\t<h3 id=\"{{$name_html}}\">func <a href=\"/{{posLink_url .Decl $.FSet}}\">{{$name_html}}</a></h3>
- {{example_html $tname $.Examples $.FSet}}
の行が削除されています。これは、型の宣言とドキュメントの直後にあったサンプルコードの表示部分です。+ {{example_html $tname $.Examples $.FSet}}
の行が追加されています。これは、型の定数と変数のリストを処理する{{end}}
タグの直後、かつファクトリ関数(Factories
)のリストを処理する{{range .Factories}}
タグの直前に挿入されています。
コアとなるコードの解説
この変更は、godoc
がGoの型に関するドキュメントを生成する際のHTML構造を再編成するものです。
{{$tname_html}}
: 現在処理している型の名前をHTMLエスケープしたものです。{{posLink_url .Decl $.FSet}}
: 型の宣言元へのリンクを生成します。{{comment_html .Doc}}
: 型のドキュメントコメントをHTMLとしてレンダリングします。{{node_html .Decl $.FSet}}
: 型の宣言コード(例:type MyType struct { ... }
)をHTMLとしてレンダリングします。{{example_html $tname $.Examples $.FSet}}
:$tname
(型名)に関連するサンプルコード($.Examples
)をHTMLとしてレンダリングします。$.FSet
はファイルセット情報で、ソースコードへのリンク生成などに使われます。{{range .Consts}}
/{{range .Vars}}
: 型に属する定数や変数をループ処理し、それぞれのドキュメントと宣言コードをレンダリングします。{{range .Factories}}
: 型に関連するファクトリ関数(通常はfunc NewType(...)
のような関数)をループ処理し、それぞれのドキュメントと宣言コードをレンダリングします。
このコミットは、example_html
の呼び出し位置を移動させることで、godoc
が生成するドキュメントのセクション順序を変更しています。これにより、型の基本的な定義、関連する定数や変数、そしてその後に型全体の利用例が続くという、より論理的で読みやすいドキュメント構造が実現されます。
関連リンク
- Go Issue 2466: godoc: type examples should appear after variables
- Go CL 5451094: godoc: Show type examples between variables and methods.
- https://golang.org/cl/5451094 (これは古いGerritのURLで、現在はGitHubのコミットにリダイレクトされるはずです)
参考にした情報源リンク
- Go言語の公式ドキュメント: https://go.dev/
godoc
のソースコード(特にlib/godoc/package.html
): https://github.com/golang/go/blob/master/src/cmd/go/internal/modfetch/codehost.go (このパスはgodoc
のテンプレートファイルがある場所ではありません。正確なパスはgo/src/cmd/godoc/package.html
のような形ですが、Goのリポジトリ構造は時間とともに変化します。コミット時のパスはlib/godoc/package.html
でした。)- Go Examples: https://go.dev/blog/examples
- Go
text/template
およびhtml/template
パッケージのドキュメント: https://pkg.go.dev/text/template - Go Issue Tracker: https://github.com/golang/go/issues
- Go Code Review (Gerrit): https://go-review.googlesource.com/ (古い変更リストの参照元)