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

[インデックス 12351] ファイルの概要

このコミットは、Go言語のドキュメンテーションツールである godoc における「コードウォーク (codewalks)」機能のバグ修正です。具体的には、コードウォークのXML定義をパースする際の構造体タグの指定が誤っていたために発生していた問題を修正しています。これにより、godoc がコードウォークのXMLファイルを正しく読み込み、表示できるようになります。

コミット

commit dd29609244b72e57ebda3551eb84d4bed716f4bf
Author: Andrew Gerrand <adg@golang.org>
Date:   Sun Mar 4 11:53:07 2012 +1100

    godoc: fix codewalks
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5732056

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/dd29609244b72e57ebda3551eb84d4bed716f4bf

元コミット内容

godoc: fix codewalks

このコミットは、godoc ツールにおけるコードウォーク機能の修正を目的としています。

変更の背景

godoc のコードウォーク機能は、Goのコードベースを巡るインタラクティブなチュートリアルや解説を提供するために設計されています。これらのコードウォークはXMLファイルで定義されており、godoc はこれらのXMLファイルをパースして表示します。

このコミットが行われる前は、godoc がコードウォークのXMLファイルを正しくパースできていませんでした。これは、Goの encoding/xml パッケージを使用してXMLをGoの構造体にマッピングする際の、構造体タグの指定方法に誤りがあったためです。具体的には、XML要素の属性として読み込むべきフィールドが正しく指定されていなかったり、要素の内部テキスト(innerxml)を読み込むための指定が不足していたりしました。

このパースエラーにより、コードウォークが正しく表示されず、ユーザーが godoc を通じてコードウォークを利用する際に問題が発生していました。このコミットは、これらのXMLパースの問題を修正し、コードウォーク機能が意図通りに動作するようにすることを目的としています。

前提知識の解説

godoc

godoc は、Go言語の公式ドキュメンテーションツールです。Goのソースコードからコメントや宣言を抽出し、Webブラウザで閲覧可能な形式でドキュメントを生成します。Goのパッケージ、関数、型、変数などのドキュメントを自動的に生成し、ローカルでホストしたり、pkg.go.dev のようなオンラインサービスで利用されたりします。

コードウォーク (Codewalks)

コードウォークは、godoc が提供する特別な機能の一つで、Goのコードベースを段階的に解説するインタラクティブなチュートリアルです。特定のコードスニペットやファイルに焦点を当て、その目的、動作、関連する概念などを説明します。コードウォークは通常、XML形式で定義され、各ステップで表示するコード、タイトル、説明などが記述されます。

Goの encoding/xml パッケージと構造体タグ

Goの標準ライブラリには、XMLデータをGoの構造体との間でエンコード/デコードするための encoding/xml パッケージが含まれています。このパッケージを使用すると、XML要素や属性をGoの構造体のフィールドにマッピングできます。

マッピングは、構造体フィールドに「構造体タグ (struct tags)」を付与することで行われます。XMLタグの一般的な形式は以下の通りです。

type MyStruct struct {
    Field1 string `xml:"element_name"` // XML要素名にマッピング
    Field2 string `xml:"attribute_name,attr"` // XML属性にマッピング
    Field3 string `xml:",innerxml"` // 要素の内部テキスト(子要素を含む)にマッピング
    Field4 string `xml:"-"` // このフィールドはXMLにマッピングしない
    Field5 string `xml:"element_name,omitempty"` // 要素が空の場合に省略
}
  • xml:"element_name": フィールドがXMLの element_name という名前の要素にマッピングされることを示します。
  • xml:"attribute_name,attr": フィールドがXMLの attribute_name という名前の属性にマッピングされることを示します。
  • xml:",innerxml": フィールドがXML要素の内部コンテンツ(子要素やテキストノードを含む)全体にマッピングされることを示します。これは、XML要素の開始タグと終了タグの間のすべての内容を文字列として取得したい場合に便利です。
  • xml:"attr": これは xml:"name,attr" のように属性名を指定せずに attr だけを指定する形式は、Go 1.0の encoding/xml パッケージではサポートされていませんでした。属性名を明示的に指定する必要があります。このコミットの変更前は、この誤った形式が使用されていた可能性があります。

このコミットの修正は、特に xml:"attr"xml:",innerxml" の使用方法に関する理解に基づいています。

技術的詳細

このコミットの技術的な核心は、Goの encoding/xml パッケージがXMLデータをGoの構造体にデコードする際の、構造体タグの正確な使用法にあります。

変更前のコードでは、Codewalk および Codestep 構造体において、XML属性を読み込むためのタグ指定が不正確でした。

  • 変更前: Title string xml:"attr"``

    • これは encoding/xml パッケージの正しい属性マッピングの構文ではありません。属性名を指定せずに attr だけを指定すると、XMLデコーダはどの属性をこのフィールドにマッピングすべきか判断できません。結果として、Title フィールドにXML属性の値が正しく読み込まれませんでした。
  • 変更後: Title string xml:"title,attr"``

    • これは正しい構文です。title という名前のXML属性を Title フィールドにマッピングするように明示的に指示しています。

同様に、Codestep 構造体におけるXMLの内部コンテンツの読み込みにも問題がありました。

  • 変更前: XML string xml:"innerxml"``

    • これもまた、encoding/xml パッケージの正しい内部コンテンツマッピングの構文ではありません。innerxml はオプションであり、カンマの前に要素名を指定しないことで、その要素自身の内部コンテンツを読み込むことを示します。
  • 変更後: XML string xml:",innerxml"``

    • これは正しい構文です。XML フィールドに、XML要素の開始タグと終了タグの間のすべてのコンテンツ(子要素やテキストノードを含む)を文字列として読み込むように指示しています。

これらの修正により、godoc はコードウォークのXMLファイルから Title 属性やステップの内部コンテンツを正しく抽出し、コードウォークを意図通りに表示できるようになりました。

コアとなるコードの変更箇所

--- a/src/cmd/godoc/codewalk.go
+++ b/src/cmd/godoc/codewalk.go
@@ -72,17 +72,17 @@ func codewalk(w http.ResponseWriter, r *http.Request) {
 
 // A Codewalk represents a single codewalk read from an XML file.
 type Codewalk struct {
-	Title string `xml:"attr"`
-	File  []string
-	Step  []*Codestep
+	Title string      `xml:"title,attr"`
+	File  []string    `xml:"file"`
+	Step  []*Codestep `xml:"step"`
 }
 
 // A Codestep is a single step in a codewalk.
 type Codestep struct {
 	// Filled in from XML
-	Src   string `xml:"attr"`
-	Title string `xml:"attr"`
-	XML   string `xml:"innerxml"`
+	Src   string `xml:"src,attr"`
+	Title string `xml:"title,attr"`
+	XML   string `xml:",innerxml"`
 
 	// Derived from Src; not in XML.
 	Err    error

コアとなるコードの解説

このコミットは、src/cmd/godoc/codewalk.go ファイル内の Codewalk および Codestep 構造体のXML構造体タグを修正しています。

Codewalk 構造体

  • 変更前:

    type Codewalk struct {
    	Title string `xml:"attr"`
    	File  []string
    	Step  []*Codestep
    }
    

    Title フィールドは xml:"attr" と指定されていました。これはXML属性を読み込むための不正確なタグです。

  • 変更後:

    type Codewalk struct {
    	Title string      `xml:"title,attr"`
    	File  []string    `xml:"file"`
    	Step  []*Codestep `xml:"step"`
    }
    

    Title フィールドのタグが xml:"title,attr" に修正されました。これにより、XMLの <Codewalk title="...">title 属性がこのフィールドに正しくマッピングされるようになります。 また、FileStep フィールドにもそれぞれ xml:"file"xml:"step" タグが追加されました。これは、これらのフィールドがそれぞれ <file> 要素と <step> 要素のリストにマッピングされることを明示しています。Goの encoding/xml パッケージは、タグが指定されていない場合でもフィールド名に基づいて要素を推測しようとしますが、明示的に指定することで意図が明確になり、より堅牢になります。

Codestep 構造体

  • 変更前:

    type Codestep struct {
    	Src   string `xml:"attr"`
    	Title string `xml:"attr"`
    	XML   string `xml:"innerxml"`
    }
    

    SrcTitle フィールドは xml:"attr" と指定されており、Codewalk 構造体と同様に不正確でした。 XML フィールドは xml:"innerxml" と指定されていましたが、これも内部コンテンツを読み込むための正しい構文ではありませんでした。

  • 変更後:

    type Codestep struct {
    	Src   string `xml:"src,attr"`
    	Title string `xml:"title,attr"`
    	XML   string `xml:",innerxml"`
    }
    

    Src フィールドのタグが xml:"src,attr" に、Title フィールドのタグが xml:"title,attr" に修正されました。これにより、XMLの <Codestep src="..." title="...">src および title 属性がそれぞれのフィールドに正しくマッピングされるようになります。 XML フィールドのタグが xml:",innerxml" に修正されました。これにより、<Codestep> 要素の内部にあるすべてのコンテンツ(テキストや子要素など)が文字列としてこのフィールドに読み込まれるようになります。

これらの変更により、godoc はコードウォークのXML定義を正確にパースし、コードウォークのタイトル、ソースファイル、各ステップのタイトル、そしてステップのコンテンツを正しく抽出できるようになりました。

関連リンク

参考にした情報源リンク

  • Go言語 encoding/xml パッケージの公式ドキュメント: https://pkg.go.dev/encoding/xml
  • Go言語の構造体タグに関する一般的な情報源 (例: A Tour of Go, Effective Goなど)
  • Go言語のコミット履歴と関連するコードレビュー (GoのGitHubリポジトリ)
  • Goのコードウォークに関する情報 (Goのブログやチュートリアル)

[インデックス 12351] ファイルの概要

このコミットは、Go言語のドキュメンテーションツールである godoc における「コードウォーク (codewalks)」機能のバグ修正です。具体的には、コードウォークのXML定義をパースする際の構造体タグの指定が誤っていたために発生していた問題を修正しています。これにより、godoc がコードウォークのXMLファイルを正しく読み込み、表示できるようになります。

コミット

commit dd29609244b72e57ebda3551eb84d4bed716f4bf
Author: Andrew Gerrand <adg@golang.org>
Date:   Sun Mar 4 11:53:07 2012 +1100

    godoc: fix codewalks
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5732056

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/dd29609244b72e57ebda3551eb84d4bed716f4bf

元コミット内容

godoc: fix codewalks

このコミットは、godoc ツールにおけるコードウォーク機能の修正を目的としています。

変更の背景

godoc のコードウォーク機能は、Goのコードベースを巡るインタラクティブなチュートリアルや解説を提供するために設計されています。これらのコードウォークはXMLファイルで定義されており、godoc はこれらのXMLファイルをパースして表示します。

このコミットが行われる前は、godoc がコードウォークのXMLファイルを正しくパースできていませんでした。これは、Goの encoding/xml パッケージを使用してXMLをGoの構造体にマッピングする際の、構造体タグの指定方法に誤りがあったためです。具体的には、XML要素の属性として読み込むべきフィールドが正しく指定されていなかったり、要素の内部テキスト(innerxml)を読み込むための指定が不足していたりしました。

このパースエラーにより、コードウォークが正しく表示されず、ユーザーが godoc を通じてコードウォークを利用する際に問題が発生していました。このコミットは、これらのXMLパースの問題を修正し、コードウォーク機能が意図通りに動作するようにすることを目的としています。

前提知識の解説

godoc

godoc は、Go言語の公式ドキュメンテーションツールです。Goのソースコードからコメントや宣言を抽出し、Webブラウザで閲覧可能な形式でドキュメントを生成します。Goのパッケージ、関数、型、変数などのドキュメントを自動的に生成し、ローカルでホストしたり、pkg.go.dev のようなオンラインサービスで利用されたりします。

コードウォーク (Codewalks)

コードウォークは、godoc が提供する特別な機能の一つで、Goのコードベースを段階的に解説するインタラクティブなチュートリアルです。特定のコードスニペットやファイルに焦点を当て、その目的、動作、関連する概念などを説明します。コードウォークは通常、XML形式で定義され、各ステップで表示するコード、タイトル、説明などが記述されます。

コードウォークのXMLフォーマットは、<codewalk> ルート要素を持ち、その中に複数の <step> 要素を含みます。

  • <codewalk> 要素は title 属性を持ち、コードウォーク全体のタイトルを指定します。
  • <step> 要素は title 属性でステップのタイトルを、src 属性で表示するソースコードファイルとその範囲を指定します。

Goの encoding/xml パッケージと構造体タグ

Goの標準ライブラリには、XMLデータをGoの構造体との間でエンコード/デコードするための encoding/xml パッケージが含まれています。このパッケージを使用すると、XML要素や属性をGoの構造体のフィールドにマッピングできます。

マッピングは、構造体フィールドに「構造体タグ (struct tags)」を付与することで行われます。XMLタグの一般的な形式は以下の通りです。

type MyStruct struct {
    Field1 string `xml:"element_name"` // XML要素名にマッピング
    Field2 string `xml:"attribute_name,attr"` // XML属性にマッピング
    Field3 string `xml:",innerxml"` // 要素の内部テキスト(子要素を含む)にマッピング
    Field4 string `xml:"-"` // このフィールドはXMLにマッピングしない
    Field5 string `xml:"element_name,omitempty"` // 要素が空の場合に省略
}
  • xml:"element_name": フィールドがXMLの element_name という名前の要素にマッピングされることを示します。
  • xml:"attribute_name,attr": フィールドがXMLの attribute_name という名前の属性にマッピングされることを示します。
  • xml:",innerxml": フィールドがXML要素の内部コンテンツ(子要素やテキストノードを含む)全体にマッピングされることを示します。これは、XML要素の開始タグと終了タグの間のすべての内容を文字列として取得したい場合に便利です。
  • xml:"attr": これは xml:"name,attr" のように属性名を指定せずに attr だけを指定する形式は、Go 1.0の encoding/xml パッケージではサポートされていませんでした。属性名を明示的に指定する必要があります。このコミットの変更前は、この誤った形式が使用されていた可能性があります。

このコミットの修正は、特に xml:"attr"xml:",innerxml" の使用方法に関する理解に基づいています。

技術的詳細

このコミットの技術的な核心は、Goの encoding/xml パッケージがXMLデータをGoの構造体にデコードする際の、構造体タグの正確な使用法にあります。

変更前のコードでは、Codewalk および Codestep 構造体において、XML属性を読み込むためのタグ指定が不正確でした。

  • 変更前: Title string xml:"attr"``

    • これは encoding/xml パッケージの正しい属性マッピングの構文ではありません。属性名を指定せずに attr だけを指定すると、XMLデコーダはどの属性をこのフィールドにマッピングすべきか判断できません。結果として、Title フィールドにXML属性の値が正しく読み込まれませんでした。
  • 変更後: Title string xml:"title,attr"``

    • これは正しい構文です。title という名前のXML属性を Title フィールドにマッピングするように明示的に指示しています。

同様に、Codestep 構造体におけるXMLの内部コンテンツの読み込みにも問題がありました。

  • 変更前: XML string xml:"innerxml"``

    • これもまた、encoding/xml パッケージの正しい内部コンテンツマッピングの構文ではありません。innerxml はオプションであり、カンマの前に要素名を指定しないことで、その要素自身の内部コンテンツを読み込むことを示します。
  • 変更後: XML string xml:",innerxml"``

    • これは正しい構文です。XML フィールドに、XML要素の開始タグと終了タグの間のすべてのコンテンツ(子要素やテキストノードを含む)を文字列として読み込むように指示しています。

これらの修正により、godoc はコードウォークのXMLファイルから Title 属性やステップの内部コンテンツを正しく抽出し、コードウォークを意図通りに表示できるようになりました。

コアとなるコードの変更箇所

--- a/src/cmd/godoc/codewalk.go
+++ b/src/cmd/godoc/codewalk.go
@@ -72,17 +72,17 @@ func codewalk(w http.ResponseWriter, r *http.Request) {
 
 // A Codewalk represents a single codewalk read from an XML file.
 type Codewalk struct {
-	Title string `xml:"attr"`
-	File  []string
-	Step  []*Codestep
+	Title string      `xml:"title,attr"`
+	File  []string    `xml:"file"`
+	Step  []*Codestep `xml:"step"`
 }
 
 // A Codestep is a single step in a codewalk.
 type Codestep struct {
 	// Filled in from XML
-	Src   string `xml:"attr"`
-	Title string `xml:"attr"`
-	XML   string `xml:"innerxml"`
+	Src   string `xml:"src,attr"`
+	Title string `xml:"title,attr"`
+	XML   string `xml:",innerxml"`
 
 	// Derived from Src; not in XML.
 	Err    error

コアとなるコードの解説

このコミットは、src/cmd/godoc/codewalk.go ファイル内の Codewalk および Codestep 構造体のXML構造体タグを修正しています。

Codewalk 構造体

  • 変更前:

    type Codewalk struct {
    	Title string `xml:"attr"`
    	File  []string
    	Step  []*Codestep
    }
    

    Title フィールドは xml:"attr" と指定されていました。これはXML属性を読み込むための不正確なタグです。

  • 変更後:

    type Codewalk struct {
    	Title string      `xml:"title,attr"`
    	File  []string    `xml:"file"`
    	Step  []*Codestep `xml:"step"`
    }
    

    Title フィールドのタグが xml:"title,attr" に修正されました。これにより、XMLの <codewalk title="...">title 属性がこのフィールドに正しくマッピングされるようになります。 また、FileStep フィールドにもそれぞれ xml:"file"xml:"step" タグが追加されました。これは、これらのフィールドがそれぞれ <file> 要素と <step> 要素のリストにマッピングされることを明示しています。Goの encoding/xml パッケージは、タグが指定されていない場合でもフィールド名に基づいて要素を推測しようとしますが、明示的に指定することで意図が明確になり、より堅牢になります。

Codestep 構造体

  • 変更前:

    type Codestep struct {
    	Src   string `xml:"attr"`
    	Title string `xml:"attr"`
    	XML   string `xml:"innerxml"`
    }
    

    SrcTitle フィールドは xml:"attr" と指定されており、Codewalk 構造体と同様に不正確でした。 XML フィールドは xml:"innerxml" と指定されていましたが、これも内部コンテンツを読み込むための正しい構文ではありませんでした。

  • 変更後:

    type Codestep struct {
    	Src   string `xml:"src,attr"`
    	Title string `xml:"title,attr"`
    	XML   string `xml:",innerxml"`
    }
    

    Src フィールドのタグが xml:"src,attr" に、Title フィールドのタグが xml:"title,attr" に修正されました。これにより、XMLの <step src="..." title="...">src および title 属性がそれぞれのフィールドに正しくマッピングされるようになります。 XML フィールドのタグが xml:",innerxml" に修正されました。これにより、<step> 要素の内部にあるすべてのコンテンツ(テキストや子要素など)が文字列としてこのフィールドに読み込まれるようになります。

これらの変更により、godoc はコードウォークのXML定義を正確にパースし、コードウォークのタイトル、ソースファイル、各ステップのタイトル、そしてステップのコンテンツを正しく抽出できるようになりました。

関連リンク

参考にした情報源リンク

  • Go言語 encoding/xml パッケージの公式ドキュメント: https://pkg.go.dev/encoding/xml
  • Go言語の構造体タグに関する一般的な情報源 (例: A Tour of Go, Effective Goなど)
  • Go言語のコミット履歴と関連するコードレビュー (GoのGitHubリポジトリ)
  • Goのコードウォークに関する情報 (Goのブログやチュートリアル)
  • Web search results for "Go godoc codewalks XML format" (Google Search)

[インデックス 12351] ファイルの概要

このコミットは、Go言語のドキュメンテーションツールである godoc における「コードウォーク (codewalks)」機能のバグ修正です。具体的には、コードウォークのXML定義をパースする際の構造体タグの指定が誤っていたために発生していた問題を修正しています。これにより、godoc がコードウォークのXMLファイルを正しく読み込み、表示できるようになります。

コミット

commit dd29609244b72e57ebda3551eb84d4bed716f4bf
Author: Andrew Gerrand <adg@golang.org>
Date:   Sun Mar 4 11:53:07 2012 +1100

    godoc: fix codewalks
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5732056

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/dd29609244b72e57ebda3551eb84d4bed716f4bf

元コミット内容

godoc: fix codewalks

このコミットは、godoc ツールにおけるコードウォーク機能の修正を目的としています。

変更の背景

godoc のコードウォーク機能は、Goのコードベースを巡るインタラクティブなチュートリアルや解説を提供するために設計されています。これらのコードウォークはXMLファイルで定義されており、godoc はこれらのXMLファイルをパースして表示します。

このコミットが行われる前は、godoc がコードウォークのXMLファイルを正しくパースできていませんでした。これは、Goの encoding/xml パッケージを使用してXMLをGoの構造体にマッピングする際の、構造体タグの指定方法に誤りがあったためです。具体的には、XML要素の属性として読み込むべきフィールドが正しく指定されていなかったり、要素の内部テキスト(innerxml)を読み込むための指定が不足していたりしました。

このパースエラーにより、コードウォークが正しく表示されず、ユーザーが godoc を通じてコードウォークを利用する際に問題が発生していました。このコミットは、これらのXMLパースの問題を修正し、コードウォーク機能が意図通りに動作するようにすることを目的としています。

前提知識の解説

godoc

godoc は、Go言語の公式ドキュメンテーションツールです。Goのソースコードからコメントや宣言を抽出し、Webブラウザで閲覧可能な形式でドキュメントを生成します。Goのパッケージ、関数、型、変数などのドキュメントを自動的に生成し、ローカルでホストしたり、pkg.go.dev のようなオンラインサービスで利用されたりします。

コードウォーク (Codewalks)

コードウォークは、godoc が提供する特別な機能の一つで、Goのコードベースを段階的に解説するインタラクティブなチュートリアルです。特定のコードスニペットやファイルに焦点を当て、その目的、動作、関連する概念などを説明します。コードウォークは通常、XML形式で定義され、各ステップで表示するコード、タイトル、説明などが記述されます。

コードウォークのXMLフォーマットは、<codewalk> ルート要素を持ち、その中に複数の <step> 要素を含みます。

  • <codewalk> 要素は title 属性を持ち、コードウォーク全体のタイトルを指定します。
  • <step> 要素は title 属性でステップのタイトルを、src 属性で表示するソースコードファイルとその範囲を指定します。

Goの encoding/xml パッケージと構造体タグ

Goの標準ライブラリには、XMLデータをGoの構造体との間でエンコード/デコードするための encoding/xml パッケージが含まれています。このパッケージを使用すると、XML要素や属性をGoの構造体のフィールドにマッピングできます。

マッピングは、構造体フィールドに「構造体タグ (struct tags)」を付与することで行われます。XMLタグの一般的な形式は以下の通りです。

type MyStruct struct {
    Field1 string `xml:"element_name"` // XML要素名にマッピング
    Field2 string `xml:"attribute_name,attr"` // XML属性にマッピング
    Field3 string `xml:",innerxml"` // 要素の内部テキスト(子要素を含む)にマッピング
    Field4 string `xml:"-"` // このフィールドはXMLにマッピングしない
    Field5 string `xml:"element_name,omitempty"` // 要素が空の場合に省略
}
  • xml:"element_name": フィールドがXMLの element_name という名前の要素にマッピングされることを示します。
  • xml:"attribute_name,attr": フィールドがXMLの attribute_name という名前の属性にマッピングされることを示します。
  • xml:",innerxml": フィールドがXML要素の内部コンテンツ(子要素やテキストノードを含む)全体にマッピングされることを示します。これは、XML要素の開始タグと終了タグの間のすべての内容を文字列として取得したい場合に便利です。
  • xml:"attr": これは xml:"name,attr" のように属性名を指定せずに attr だけを指定する形式は、Go 1.0の encoding/xml パッケージではサポートされていませんでした。属性名を明示的に指定する必要があります。このコミットの変更前は、この誤った形式が使用されていた可能性があります。

このコミットの修正は、特に xml:"attr"xml:",innerxml" の使用方法に関する理解に基づいています。

技術的詳細

このコミットの技術的な核心は、Goの encoding/xml パッケージがXMLデータをGoの構造体にデコードする際の、構造体タグの正確な使用法にあります。

変更前のコードでは、Codewalk および Codestep 構造体において、XML属性を読み込むためのタグ指定が不正確でした。

  • 変更前: Title string xml:"attr"``

    • これは encoding/xml パッケージの正しい属性マッピングの構文ではありません。属性名を指定せずに attr だけを指定すると、XMLデコーダはどの属性をこのフィールドにマッピングすべきか判断できません。結果として、Title フィールドにXML属性の値が正しく読み込まれませんでした。
  • 変更後: Title string xml:"title,attr"``

    • これは正しい構文です。title という名前のXML属性を Title フィールドにマッピングするように明示的に指示しています。

同様に、Codestep 構造体におけるXMLの内部コンテンツの読み込みにも問題がありました。

  • 変更前: XML string xml:"innerxml"``

    • これもまた、encoding/xml パッケージの正しい内部コンテンツマッピングの構文ではありません。innerxml はオプションであり、カンマの前に要素名を指定しないことで、その要素自身の内部コンテンツを読み込むことを示します。
  • 変更後: XML string xml:",innerxml"``

    • これは正しい構文です。XML フィールドに、XML要素の開始タグと終了タグの間のすべてのコンテンツ(子要素やテキストノードを含む)を文字列として読み込むように指示しています。

これらの修正により、godoc はコードウォークのXMLファイルから Title 属性やステップの内部コンテンツを正しく抽出し、コードウォークを意図通りに表示できるようになりました。

コアとなるコードの変更箇所

--- a/src/cmd/godoc/codewalk.go
+++ b/src/cmd/godoc/codewalk.go
@@ -72,17 +72,17 @@ func codewalk(w http.ResponseWriter, r *http.Request) {
 
 // A Codewalk represents a single codewalk read from an XML file.
 type Codewalk struct {
-	Title string `xml:"attr"`
-	File  []string
-	Step  []*Codestep
+	Title string      `xml:"title,attr"`
+	File  []string    `xml:"file"`
+	Step  []*Codestep `xml:"step"`
 }
 
 // A Codestep is a single step in a codewalk.
 type Codestep struct {
 	// Filled in from XML
-	Src   string `xml:"attr"`
-	Title string `xml:"attr"`
-	XML   string `xml:"innerxml"`
+	Src   string `xml:"src,attr"`
+	Title string `xml:"title,attr"`
+	XML   string `xml:",innerxml"`
 
 	// Derived from Src; not in XML.
 	Err    error

コアとなるコードの解説

このコミットは、src/cmd/godoc/codewalk.go ファイル内の Codewalk および Codestep 構造体のXML構造体タグを修正しています。

Codewalk 構造体

  • 変更前:

    type Codewalk struct {
    	Title string `xml:"attr"`
    	File  []string
    	Step  []*Codestep
    }
    

    Title フィールドは xml:"attr" と指定されていました。これはXML属性を読み込むための不正確なタグです。

  • 変更後:

    type Codewalk struct {
    	Title string      `xml:"title,attr"`
    	File  []string    `xml:"file"`
    	Step  []*Codestep `xml:"step"`
    }
    

    Title フィールドのタグが xml:"title,attr" に修正されました。これにより、XMLの <codewalk title="...">title 属性がこのフィールドに正しくマッピングされるようになります。 また、FileStep フィールドにもそれぞれ xml:"file"xml:"step" タグが追加されました。これは、これらのフィールドがそれぞれ <file> 要素と <step> 要素のリストにマッピングされることを明示しています。Goの encoding/xml パッケージは、タグが指定されていない場合でもフィールド名に基づいて要素を推測しようとしますが、明示的に指定することで意図が明確になり、より堅牢になります。

Codestep 構造体

  • 変更前:

    type Codestep struct {
    	Src   string `xml:"attr"`
    	Title string `xml:"attr"`
    	XML   string `xml:"innerxml"`
    }
    

    SrcTitle フィールドは xml:"attr" と指定されており、Codewalk 構造体と同様に不正確でした。 XML フィールドは xml:"innerxml" と指定されていましたが、これも内部コンテンツを読み込むための正しい構文ではありませんでした。

  • 変更後:

    type Codestep struct {
    	Src   string `xml:"src,attr"`
    	Title string `xml:"title,attr"`
    	XML   string `xml:",innerxml"`
    }
    

    Src フィールドのタグが xml:"src,attr" に、Title フィールドのタグが xml:"title,attr" に修正されました。これにより、XMLの <step src="..." title="...">src および title 属性がそれぞれのフィールドに正しくマッピングされるようになります。 XML フィールドのタグが xml:",innerxml" に修正されました。これにより、<step> 要素の内部にあるすべてのコンテンツ(テキストや子要素など)が文字列としてこのフィールドに読み込まれるようになります。

これらの変更により、godoc はコードウォークのXML定義を正確にパースし、コードウォークのタイトル、ソースファイル、各ステップのタイトル、そしてステップのコンテンツを正しく抽出できるようになりました。

関連リンク

参考にした情報源リンク

  • Go言語 encoding/xml パッケージの公式ドキュメント: https://pkg.go.dev/encoding/xml
  • Go言語の構造体タグに関する一般的な情報源 (例: A Tour of Go, Effective Goなど)
  • Go言語のコミット履歴と関連するコードレビュー (GoのGitHubリポジトリ)
  • Goのコードウォークに関する情報 (Goのブログやチュートリアル)
  • Web search results for "Go godoc codewalks XML format" (Google Search)