2016-10-06 1 views
2

次ゴーテンプレートプロセスを失敗し、動作します:ゴーテンプレートを再定義:時にはエラーなし

{{block "A" "hello"}}{{end}} 
{{define "A"}}{{.}}{{end}} 

私はドキュメントを読んで期待通りの出力が「こんにちは」、です。これとは対照的に、以下のテンプレートが解析されません。ここで

{{block "A" "hello"}}A{{end}} 
{{define "A"}}{{.}}{{end}} 

が、私は最初はそうではない

template: multiple definition of template "A" 

はなぜ2番目のテンプレートがエラーを与えないエラーメッセージが表示されますか?この違いは意図されていますか?

完全なコードはここにある:答えはhtml/template.Parse()のドキュメントにあるhttps://play.golang.org/p/CNAqllVLjB

答えて

2

{{block "A"}}は空のテンプレートを定義し、それを再ことが許されているので

[...] It is an error if a resulting template is non-empty (contains content other than template definitions) and would replace a non-empty template with the same name. (In multiple calls to Parse with the same receiver template, only one call can contain text other than space, comments, and template definitions.)

あなたの最初のテンプレートが動作します定義された。

{{block "A"}}は空でないテンプレートを定義していますが、空ではないテンプレートで再定義しようとしたため、2番目のテンプレートが失敗します。

ここで留意すべき点はhtml/templateパッケージのドキュメントを引用しました。これはtext/templateと同一である必要があります。ほとんどの場合ですが、text/template.Parse()はこの重要な詳細を除いて同じですが、同じように動作します。これは文書の矛盾であり、ここで追跡できる問題を提出しました:issue #17360

+0

html /テンプレートのドキュメントを参照していただきありがとうございます。私はまだ何かが欠けています:文書中の '{{block}}'の例は空でないテンプレートを別のものに置き換えます。コードはhttps://play.golang.org/p/cPuVy7im5Jです。これがうまくいくとすれば、テキストは "Parse()' * "などの呼び出しで定義された*と同じ名前の空でないテンプレートを置き換えるでしょうか? – jochen

+0

@jochenはい、そうですが、ドキュメントはここで少し誤解を招くことがあります。しかし、ちょっと、博士は 'Parse()'の1回の呼び出しについて説明しています(最後の括弧で囲まれた部分はわかりませんが、私にとっては間違っています)。 – icza

関連する問題