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

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

このコミットは、Go言語の標準ライブラリである html/template パッケージにおけるバグ修正を扱っています。具体的には、テンプレートのパース後に html/templateTree フィールドが適切に更新されない問題に対処しています。この問題は、エスケープ処理中にエラーが発生した場合に、正しいテンプレートツリーが参照できなくなる可能性がありました。

コミット

commit e2e9d1d6841d4ee937568eeb73a9b43e73e88ad3
Author: Rob Pike <r@golang.org>
Date:   Wed Sep 25 10:00:09 2013 +1000

    html/template: update the Tree field after parsing new templates
    After text/template.Parse, all the templates may have changed, so
    we need to set them all back to their unescaped state. The code
    did this but (mea culpa) forgot to set the Tree field of the html/template
    struct.
    
    Since the Tree is reset during escaping, this only matters if an error
    arises during escaping and we want to print a message.
    
    Fixes #6459.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/13877043

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

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

元コミット内容

html/template: update the Tree field after parsing new templates

text/template.Parse の後、全てのテンプレートが変更されている可能性があるため、それらをエスケープされていない元の状態に戻す必要がありました。コードはこの処理を行っていましたが、html/template 構造体の Tree フィールドを設定し忘れていました(私の過失です)。

Tree はエスケープ中にリセットされるため、この問題はエスケープ中にエラーが発生し、メッセージを出力したい場合にのみ影響します。

Fixes #6459.

R=golang-dev, rsc CC=golang-dev https://golang.org/cl/13877043

変更の背景

このコミットは、Go言語の html/template パッケージにおける特定のバグ(Issue #6459)を修正するために行われました。html/template は、ウェブアプリケーションなどでHTMLコンテンツを安全に生成するためのテンプレートエンジンです。クロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を防ぐために、自動的にコンテンツをエスケープする機能を持っています。

問題の核心は、html/template が内部的に text/template パッケージを利用している点にあります。text/template.Parse メソッドが呼び出された後、テンプレートの内部表現(構文木、Tree フィールド)が更新される可能性があります。しかし、html/template 側で、この Tree フィールドの更新が適切に行われていませんでした。

具体的には、html/template はテンプレートをパースした後、セキュリティ上の理由からエスケープ処理を行います。このエスケープ処理の過程で、元の text/templateTree フィールドが参照されることがあります。もし html/template 自身の Tree フィールドが text/template の最新の Tree を指していない場合、特にエスケープ処理中にエラーが発生した際に、誤った構文木を参照してしまう可能性がありました。これにより、エラーメッセージの表示やデバッグが困難になる、あるいは予期せぬ動作を引き起こす可能性がありました。

このバグは、エスケープ処理中にエラーが発生した場合にのみ顕在化するため、通常のテンプレート実行では問題にならないことが多かったと考えられます。しかし、堅牢なシステムを構築するためには、このようなエッジケースも適切に処理される必要があります。

前提知識の解説

このコミットを理解するためには、以下のGo言語のテンプレートパッケージに関する知識が必要です。

  1. text/template パッケージ:

    • Go言語の基本的なテキストテンプレートエンジンです。任意のテキスト形式の出力を生成するために使用されます。
    • テンプレートは、プレースホルダー(例: {{.Name}})や制御構造(例: {{if .Condition}}...{{end}})を含むテキストとして定義されます。
    • テンプレートがパースされると、その内部表現として「構文木(Parse Tree)」が生成されます。この構文木は、template.Tree 型で表現され、テンプレートの構造とロジックを抽象化したものです。
    • Parse メソッドは、文字列からテンプレートを解析し、その結果として *template.Template オブジェクトを返します。このオブジェクトは、パースされたテンプレートの構文木を内部に保持しています。
  2. html/template パッケージ:

    • text/template パッケージを基盤として構築されており、HTMLコンテンツの生成に特化しています。
    • 最も重要な機能は、自動エスケープ(Auto-escaping)です。これにより、テンプレートに挿入されるデータが、HTMLコンテキスト(例: <div> タグ内)、URLコンテキスト(例: href 属性)、JavaScriptコンテキスト(例: <script> タグ内)などに応じて適切にエスケープされます。これにより、XSS攻撃などのセキュリティ脆弱性を防ぎます。
    • html/templateTemplate 構造体は、内部に text/template.Template のインスタンス(通常は text フィールドとして)を保持しています。
    • html/template は、text/template が生成した構文木を基に、さらにHTMLエスケープのための変換処理を行います。この変換後の構文木も、html/template.Template 構造体内の Tree フィールドに保持されます。
  3. template.Tree フィールド:

    • text/template.Template および html/template.Template 構造体に含まれるフィールドで、パースされたテンプレートの抽象構文木(AST)を指します。
    • この構文木は、テンプレートの構造、変数、関数呼び出し、制御フローなどを表現しており、テンプレートの実行時に解釈されます。
    • html/template の場合、この Tree フィールドは、エスケープ処理後のテンプレートの構文木を保持することが期待されます。
  4. テンプレートのパースとエスケープのライフサイクル:

    • ユーザーが html/template.Template.Parse() メソッドを呼び出すと、まず内部的に text/template.Template.Parse() が呼び出され、基本的な構文木が生成されます。
    • 次に、html/template はこの構文木を走査し、HTMLエスケープルールに基づいてノードを変換します。例えば、{{.UserContent}} のようなプレースホルダーは、HTMLエンティティに変換されるようにマークされます。
    • このエスケープ処理の結果、html/template.Template 構造体の Tree フィールドが更新され、エスケープ後の構文木を指すようになります。

このコミットは、この「エスケープ後の構文木を指すように Tree フィールドを更新する」という最後のステップが、特定の条件下で欠落していたために発生したバグを修正するものです。

技術的詳細

このコミットの技術的な詳細は、html/template パッケージが text/template パッケージの機能をどのように拡張し、その際に発生しうる内部状態の不整合をどのように修正したかにあります。

html/template.Template 構造体は、内部に text/template.Template 型の text フィールドを持っています。html/templateParse メソッドが呼び出されると、まずこの text フィールドを通じて text/template のパース処理が行われます。

// src/pkg/html/template/template.go (変更前)
func (t *Template) Parse(src string) (*Template, error) {
    // ...
    if tmpl == nil {
        tmpl = t.new(name)
    }
    // Restore our record of this text/template to its unescaped original state.
    tmpl.escaped = false
    tmpl.text = v // ここで text/template のインスタンスを更新
    // tmpl.Tree = v.Tree が欠落していた
    // ...
}

上記のコードスニペット(変更前)では、tmpl.text = v という行で、html/template の内部にある text/template.Template インスタンスが、新しくパースされたテンプレート v に置き換えられています。しかし、html/template.Template 自身の Tree フィールドは、この vTree フィールドを指すように更新されていませんでした。

html/template は、テンプレートをエスケープする際に、html/template.TemplateTree フィールドを参照します。もし Parse 処理後に Tree フィールドが更新されていないと、古い(またはnilの)構文木を参照してしまう可能性があります。コミットメッセージにあるように、「Tree はエスケープ中にリセットされる」とありますが、これはエスケープ処理が成功した場合の話です。エスケープ処理中にエラーが発生した場合、エラーメッセージを生成する際に、正しい Tree が参照できないと、デバッグ情報が不正確になるなどの問題が生じます。

このコミットは、tmpl.text = v の直後に tmpl.Tree = v.Tree を追加することで、この不整合を解消しています。これにより、html/templateTemplate 構造体が常に最新かつ正確な構文木を保持するようになります。

また、escape_test.go に追加されたテストケースは、このバグが修正されたことを検証しています。

// src/pkg/html/template/escape_test.go (追加されたテスト)
// Check for bug 6459: Tree field was not set in Parse.
if tmpl.Tree != tmpl.text.Tree {
    t.Errorf("%s: tree not set properly", test.name)
    continue
}

このテストは、html/template.TemplateTree フィールドが、その内部の text/template.Template インスタンス (tmpl.text) の Tree フィールドと一致していることを確認しています。これは、Parse 処理が完了した後に、両方の Tree フィールドが同じ最新の構文木を指しているべきであるという前提に基づいています。このテストの追加により、将来的に同様の回帰バグが発生するのを防ぐことができます。

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

このコミットによる主要なコード変更は、以下の2つのファイルに集中しています。

  1. src/pkg/html/template/escape_test.go:

    • バグ #6459 の修正を検証するための新しいテストケースが追加されました。
    • TestEscape 関数内に、パース後の tmpl.Treetmpl.text.Tree が一致するかどうかを確認するアサーションが追加されています。
    --- a/src/pkg/html/template/escape_test.go
    +++ b/src/pkg/html/template/escape_test.go
    @@ -655,6 +655,11 @@ func TestEscape(t *testing.T) {
     	for _, test := range tests {
     		tmpl := New(test.name)
     		tmpl = Must(tmpl.Parse(test.input))
    +		// Check for bug 6459: Tree field was not set in Parse.
    +		if tmpl.Tree != tmpl.text.Tree {
    +			t.Errorf("%s: tree not set properly", test.name)
    +			continue
    +		}
     		b := new(bytes.Buffer)
     		if err := tmpl.Execute(b, data); err != nil {
     			t.Errorf("%s: template execution failed: %s", test.name, err)
    
  2. src/pkg/html/template/template.go:

    • Template 構造体の Parse メソッド内で、Tree フィールドの更新が追加されました。
    --- a/src/pkg/html/template/template.go
    +++ b/src/pkg/html/template/template.go
    @@ -128,8 +128,10 @@ func (t *Template) Parse(src string) (*Template, error) {
     		if tmpl == nil {
     			tmpl = t.new(name)
     		}
    +		// Restore our record of this text/template to its unescaped original state.
     		tmpl.escaped = false
     		tmpl.text = v
    +		tmpl.Tree = v.Tree
     	}
     	return t, nil
     }
    

コアとなるコードの解説

src/pkg/html/template/template.go の変更

このファイルの変更は、html/template.Template 型の Parse メソッドにあります。このメソッドは、新しいテンプレート文字列を解析し、既存のテンプレートオブジェクトにマージする役割を担っています。

変更前のコードでは、tmpl.text = v という行で、html/template が内部的に保持する text/template.Template のインスタンス (tmpl.text) を、新しくパースされた text/template.Template オブジェクト v に置き換えていました。しかし、html/template.Template 自身の Tree フィールドは、この vTree フィールドを指すように更新されていませんでした。

追加された行 tmpl.Tree = v.Tree は、この問題を修正します。これにより、html/template.Template オブジェクトの Tree フィールドが、新しくパースされた text/template の構文木を正確に参照するようになります。この修正は、特にエスケープ処理中にエラーが発生した場合に、html/template が正しい構文木を参照して適切なエラーメッセージを生成するために重要です。

コメント // Restore our record of this text/template to its unescaped original state. は、このブロックの目的が、テンプレートをエスケープされていない元の状態に戻すことであることを示しています。tmpl.escaped = false もその一部であり、tmpl.Tree = v.Tree もまた、この「元の状態」を正確に反映させるための重要なステップです。

src/pkg/html/template/escape_test.go の変更

このファイルの変更は、TestEscape 関数内に新しいテストロジックを追加しています。TestEscape は、html/template のエスケープ機能が正しく動作するかどうかを検証するための包括的なテストです。

追加されたコードブロックは、tmpl = Must(tmpl.Parse(test.input)) の直後に実行されます。ここで、tmpl.Tree != tmpl.text.Tree という条件がチェックされます。

  • tmpl.Tree: html/template.Template オブジェクト自身の Tree フィールド。これは、エスケープ処理後の構文木を指すことが期待されます。
  • tmpl.text.Tree: html/template.Template が内部に持つ text/template.Template オブジェクト (tmpl.text) の Tree フィールド。これは、text/template によってパースされた元の構文木を指します。

修正が適用された後、Parse メソッドは tmpl.Treetmpl.text.Tree と同じ値に設定するため、この条件は常に false になるはずです。もし true になった場合(つまり、両者が一致しない場合)、それはバグ #6459 が再発したことを意味し、テストは t.Errorf を呼び出して失敗します。

このテストの追加により、html/template の内部状態の一貫性が保証され、将来の変更によって同様のバグが導入されることを防ぐためのセーフティネットが提供されます。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント: html/template パッケージ
  • Go言語の公式ドキュメント: text/template パッケージ
  • Go言語のソースコード(特に src/pkg/html/template/ ディレクトリ)
  • GitHubのGoリポジトリにおけるIssue #6459の議論
  • Go言語のコードレビューシステム (Gerrit) におけるCL 13877043の議論# [インデックス 17697] ファイルの概要

このコミットは、Go言語の標準ライブラリである html/template パッケージにおけるバグ修正を扱っています。具体的には、テンプレートのパース後に html/templateTree フィールドが適切に更新されない問題に対処しています。この問題は、エスケープ処理中にエラーが発生した場合に、正しいテンプレートツリーが参照できなくなる可能性がありました。

コミット

commit e2e9d1d6841d4ee937568eeb73a9b43e73e88ad3
Author: Rob Pike <r@golang.org>
Date:   Wed Sep 25 10:00:09 2013 +1000

    html/template: update the Tree field after parsing new templates
    After text/template.Parse, all the templates may have changed, so
    we need to set them all back to their unescaped state. The code
    did this but (mea culpa) forgot to set the Tree field of the html/template
    struct.
    
    Since the Tree is reset during escaping, this only matters if an error
    arises during escaping and we want to print a message.
    
    Fixes #6459.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/13877043

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

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

元コミット内容

html/template: update the Tree field after parsing new templates

text/template.Parse の後、全てのテンプレートが変更されている可能性があるため、それらをエスケープされていない元の状態に戻す必要がありました。コードはこの処理を行っていましたが、html/template 構造体の Tree フィールドを設定し忘れていました(私の過失です)。

Tree はエスケープ中にリセットされるため、この問題はエスケープ中にエラーが発生し、メッセージを出力したい場合にのみ影響します。

Fixes #6459.

R=golang-dev, rsc CC=golang-dev https://golang.org/cl/13877043

変更の背景

このコミットは、Go言語の html/template パッケージにおける特定のバグ(Issue #6459)を修正するために行われました。html/template は、ウェブアプリケーションなどでHTMLコンテンツを安全に生成するためのテンプレートエンジンです。クロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を防ぐために、自動的にコンテンツをエスケープする機能を持っています。

問題の核心は、html/template が内部的に text/template パッケージを利用している点にあります。text/template.Parse メソッドが呼び出された後、テンプレートの内部表現(構文木、Tree フィールド)が更新される可能性があります。しかし、html/template 側で、この Tree フィールドの更新が適切に行われていませんでした。

具体的には、html/template はテンプレートをパースした後、セキュリティ上の理由からエスケープ処理を行います。このエスケープ処理の過程で、元の text/templateTree フィールドが参照されることがあります。もし html/template 自身の Tree フィールドが text/template の最新の Tree を指していない場合、特にエスケープ処理中にエラーが発生した際に、誤った構文木を参照してしまう可能性がありました。これにより、エラーメッセージの表示やデバッグが困難になる、あるいは予期せぬ動作を引き起こす可能性がありました。

このバグは、エスケープ処理中にエラーが発生した場合にのみ顕在化するため、通常のテンプレート実行では問題にならないことが多かったと考えられます。しかし、堅牢なシステムを構築するためには、このようなエッジケースも適切に処理される必要があります。

前提知識の解説

このコミットを理解するためには、以下のGo言語のテンプレートパッケージに関する知識が必要です。

  1. text/template パッケージ:

    • Go言語の基本的なテキストテンプレートエンジンです。任意のテキスト形式の出力を生成するために使用されます。
    • テンプレートは、プレースホルダー(例: {{.Name}})や制御構造(例: {{if .Condition}}...{{end}})を含むテキストとして定義されます。
    • テンプレートがパースされると、その内部表現として「構文木(Parse Tree)」が生成されます。この構文木は、template.Tree 型で表現され、テンプレートの構造とロジックを抽象化したものです。
    • Parse メソッドは、文字列からテンプレートを解析し、その結果として *template.Template オブジェクトを返します。このオブジェクトは、パースされたテンプレートの構文木を内部に保持しています。
  2. html/template パッケージ:

    • text/template パッケージを基盤として構築されており、HTMLコンテンツの生成に特化しています。
    • 最も重要な機能は、自動エスケープ(Auto-escaping)です。これにより、テンプレートに挿入されるデータが、HTMLコンテキスト(例: <div> タグ内)、URLコンテキスト(例: href 属性)、JavaScriptコンテキスト(例: <script> タグ内)などに応じて適切にエスケープされます。これにより、XSS攻撃などのセキュリティ脆弱性を防ぎます。
    • html/templateTemplate 構造体は、内部に text/template.Template のインスタンス(通常は text フィールドとして)を保持しています。
    • html/template は、text/template が生成した構文木を基に、さらにHTMLエスケープのための変換処理を行います。この変換後の構文木も、html/template.Template 構造体内の Tree フィールドに保持されます。
  3. template.Tree フィールド:

    • text/template.Template および html/template.Template 構造体に含まれるフィールドで、パースされたテンプレートの抽象構文木(AST)を指します。
    • この構文木は、テンプレートの構造、変数、関数呼び出し、制御フローなどを表現しており、テンプレートの実行時に解釈されます。
    • html/template の場合、この Tree フィールドは、エスケープ処理後のテンプレートの構文木を保持することが期待されます。
  4. テンプレートのパースとエスケープのライフサイクル:

    • ユーザーが html/template.Template.Parse() メソッドを呼び出すと、まず内部的に text/template.Template.Parse() が呼び出され、基本的な構文木が生成されます。
    • 次に、html/template はこの構文木を走査し、HTMLエスケープルールに基づいてノードを変換します。例えば、{{.UserContent}} のようなプレースホルダーは、HTMLエンティティに変換されるようにマークされます。
    • このエスケープ処理の結果、html/template.TemplateTree フィールドが更新され、エスケープ後の構文木を指すようになります。

このコミットは、この「エスケープ後の構文木を指すように Tree フィールドを更新する」という最後のステップが、特定の条件下で欠落していたために発生したバグを修正するものです。

技術的詳細

このコミットの技術的な詳細は、html/template パッケージが text/template パッケージの機能をどのように拡張し、その際に発生しうる内部状態の不整合をどのように修正したかにあります。

html/template.Template 構造体は、内部に text/template.Template 型の text フィールドを持っています。html/templateParse メソッドが呼び出されると、まずこの text フィールドを通じて text/template のパース処理が行われます。

// src/pkg/html/template/template.go (変更前)
func (t *Template) Parse(src string) (*Template, error) {
    // ...
    if tmpl == nil {
        tmpl = t.new(name)
    }
    // Restore our record of this text/template to its unescaped original state.
    tmpl.escaped = false
    tmpl.text = v // ここで text/template のインスタンスを更新
    // tmpl.Tree = v.Tree が欠落していた
    // ...
}

上記のコードスニペット(変更前)では、tmpl.text = v という行で、html/template の内部にある text/template.Template インスタンスが、新しくパースされたテンプレート v に置き換えられています。しかし、html/template.Template 自身の Tree フィールドは、この vTree フィールドを指すように更新されていませんでした。

html/template は、テンプレートをエスケープする際に、html/template.TemplateTree フィールドを参照します。もし Parse 処理後に Tree フィールドが更新されていないと、古い(またはnilの)構文木を参照してしまう可能性があります。コミットメッセージにあるように、「Tree はエスケープ中にリセットされる」とありますが、これはエスケープ処理が成功した場合の話です。エスケープ処理中にエラーが発生した場合、エラーメッセージを生成する際に、正しい Tree が参照できないと、デバッグ情報が不正確になるなどの問題が生じます。

このコミットは、tmpl.text = v の直後に tmpl.Tree = v.Tree を追加することで、この不整合を解消しています。これにより、html/templateTemplate 構造体が常に最新かつ正確な構文木を保持するようになります。

また、escape_test.go に追加されたテストケースは、このバグが修正されたことを検証しています。

// src/pkg/html/template/escape_test.go (追加されたテスト)
// Check for bug 6459: Tree field was not set in Parse.
if tmpl.Tree != tmpl.text.Tree {
    t.Errorf("%s: tree not set properly", test.name)
    continue
}

このテストは、html/template.TemplateTree フィールドが、その内部の text/template.Template インスタンス (tmpl.text) の Tree フィールドと一致していることを確認しています。これは、Parse 処理が完了した後に、両方の Tree フィールドが同じ最新の構文木を指しているべきであるという前提に基づいています。このテストの追加により、将来的に同様の回帰バグが発生するのを防ぐことができます。

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

このコミットによる主要なコード変更は、以下の2つのファイルに集中しています。

  1. src/pkg/html/template/escape_test.go:

    • バグ #6459 の修正を検証するための新しいテストケースが追加されました。
    • TestEscape 関数内に、パース後の tmpl.Treetmpl.text.Tree が一致するかどうかを確認するアサーションが追加されています。
    --- a/src/pkg/html/template/escape_test.go
    +++ b/src/pkg/html/template/escape_test.go
    @@ -655,6 +655,11 @@ func TestEscape(t *testing.T) {
     	for _, test := range tests {
     		tmpl := New(test.name)
     		tmpl = Must(tmpl.Parse(test.input))
    +		// Check for bug 6459: Tree field was not set in Parse.
    +		if tmpl.Tree != tmpl.text.Tree {
    +			t.Errorf("%s: tree not set properly", test.name)
    +			continue
    +		}
     		b := new(bytes.Buffer)
     		if err := tmpl.Execute(b, data); err != nil {
     			t.Errorf("%s: template execution failed: %s", test.name, err)
    
  2. src/pkg/html/template/template.go:

    • Template 構造体の Parse メソッド内で、Tree フィールドの更新が追加されました。
    --- a/src/pkg/html/template/template.go
    +++ b/src/pkg/html/template/template.go
    @@ -128,8 +128,10 @@ func (t *Template) Parse(src string) (*Template, error) {
     		if tmpl == nil {
     			tmpl = t.new(name)
     		}
    +		// Restore our record of this text/template to its unescaped original state.
     		tmpl.escaped = false
     		tmpl.text = v
    +		tmpl.Tree = v.Tree
     	}
     	return t, nil
     }
    

コアとなるコードの解説

src/pkg/html/template/template.go の変更

このファイルの変更は、html/template.Template 型の Parse メソッドにあります。このメソッドは、新しいテンプレート文字列を解析し、既存のテンプレートオブジェクトにマージする役割を担っています。

変更前のコードでは、tmpl.text = v という行で、html/template が内部的に保持する text/template.Template のインスタンス (tmpl.text) を、新しくパースされた text/template.Template オブジェクト v に置き換えていました。しかし、html/template.Template 自身の Tree フィールドは、この vTree フィールドを指すように更新されていませんでした。

追加された行 tmpl.Tree = v.Tree は、この問題を修正します。これにより、html/template.Template オブジェクトの Tree フィールドが、新しくパースされた text/template の構文木を正確に参照するようになります。この修正は、特にエスケープ処理中にエラーが発生した場合に、html/template が正しい構文木を参照して適切なエラーメッセージを生成するために重要です。

コメント // Restore our record of this text/template to its unescaped original state. は、このブロックの目的が、テンプレートをエスケープされていない元の状態に戻すことであることを示しています。tmpl.escaped = false もその一部であり、tmpl.Tree = v.Tree もまた、この「元の状態」を正確に反映させるための重要なステップです。

src/pkg/html/template/escape_test.go の変更

このファイルの変更は、TestEscape 関数内に新しいテストロジックを追加しています。TestEscape は、html/template のエスケープ機能が正しく動作するかどうかを検証するための包括的なテストです。

追加されたコードブロックは、tmpl = Must(tmpl.Parse(test.input)) の直後に実行されます。ここで、tmpl.Tree != tmpl.text.Tree という条件がチェックされます。

  • tmpl.Tree: html/template.Template オブジェクト自身の Tree フィールド。これは、エスケープ処理後の構文木を指すことが期待されます。
  • tmpl.text.Tree: html/template.Template が内部に持つ text/template.Template オブジェクト (tmpl.text) の Tree フィールド。これは、text/template によってパースされた元の構文木を指します。

修正が適用された後、Parse メソッドは tmpl.Treetmpl.text.Tree と同じ値に設定するため、この条件は常に false になるはずです。もし true になった場合(つまり、両者が一致しない場合)、それはバグ #6459 が再発したことを意味し、テストは t.Errorf を呼び出して失敗します。

このテストの追加により、html/template の内部状態の一貫性が保証され、将来の変更によって同様のバグが導入されることを防ぐためのセーフティネットが提供されます。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント: html/template パッケージ
  • Go言語の公式ドキュメント: text/template パッケージ
  • Go言語のソースコード(特に src/pkg/html/template/ ディレクトリ)
  • GitHubのGoリポジトリにおけるIssue #6459の議論
  • Go言語のコードレビューシステム (Gerrit) におけるCL 13877043の議論