web-dev-qa-db-ja.com

テンプレート名に移動

の中に html/template(およびtext/template)パッケージ、 template.New には次の署名があります:

func New(name string) *Template

nameは正確には何に使用されますか?ドキュメント(および少しのソース)をスキャンしましたが、役に立ちませんでした。空の文字列を使用してすべてのテンプレートをインスタンス化しただけで、違いはないようです。なぜ名前を気にする必要があるのですか?

テンプレートに名前を付ける場合でも、2つは同等のようです。

template.Must(template.New("").Parse(`{{ define "body" }}Body{{ end }}`))
template.Must(template.New("body").Parse(`Body`))

https://play.golang.org/p/wKzCHdLf2S

19
Dave

テンプレートの名前は、当然のことながら、テンプレートのnameになります。

それは何のために良いですか?テンプレートを参照したくない限り、それは実際には問題ではありません。しかし、それを参照したい場合は、はい、その名前で参照します。

いつ参照したいですか?別のテンプレートを含めたい場合(例: _{{template}}_アクションを使用する場合、または Template.ExecuteTemplate() を使用して特定のテンプレートを実行する場合。

これまでのところ良好ですが、まだ重要なポイントがありません。これは明白/些細なことではありません:a _template.Template_ 値は "解析されたテンプレートの表現"です。しかし、ここでの言い回しは少し「不完全」です。 _template.Template_値は、複数の関連付けられたテンプレートのコレクションである場合があります(通常はそうです)。 _template.Template_にはエクスポートされていないフィールドがあります:

_tmpl   map[string]*Template // Map from name to defined templates.
_

このtmplフィールドには、他のすべての関連テンプレート、テンプレートに表示され、で参照できるテンプレートが保持されます。

複数のテンプレートを一度に解析する場合は、 Template.ParseFiles() または Template.ParseGlob() の場合、テンプレートはファイル名で名前が付けられ、自動的に関連付けられます(上記の関数は、関連付けられたすべての解析済みテンプレートを保持する単一の_template.Template_値を返します)。 Template.ParseFiles()のドキュメントはこれについて明確です:

ParseFilesは、新しいテンプレートを作成し、指定されたファイルからテンプレート定義を解析します。返されるテンプレートの名前には、最初のファイルのベース名と解析された内容が含まれます。 [...]

異なるディレクトリにある同じ名前の複数のファイルを解析する場合、最後に言及されたものが結果になります。たとえば、ParseFiles( "a/foo"、 "b/foo")は、 "b/foo"を "foo"という名前のテンプレートとして保存しますが、 "a/foo"は使用できません。

テンプレート名は、複数の場所から取得できます。

  • ファイル名から取得できます(上記を参照)
  • 明示的に指定できます(_{{define "somename"}}_または_{{block "somename"}}_アクションを使用して定義されている場合)。
  • または、 template.New() (function)または Template.New() に渡される引数として定義できます。 =(メソッド)

いくつかの例を見てみましょう:

_func main() {
    t := template.Must(template.New("one").Parse(t1src))
    template.Must(t.New("other").Parse(t2src))

    // error checks omitted for brevity
    // Executes default, "one":
    t.Execute(os.Stdout, nil)

    // Executes explicit, "one":
    t.ExecuteTemplate(os.Stdout, "one", nil)

    // Executes explicit, "other":
    t.ExecuteTemplate(os.Stdout, "other", nil)
}

const t1src = `I'm some template.
`
const t2src = `I'm some OTHER template.
`
_

出力( Go Playground で試してください):

_I'm some template.
I'm some template.
I'm some OTHER template.
_

ここで先に進み、最初の2行を次のように変更します。

_t := template.Must(template.New("one").Parse(t1src))
t = template.Must(t.New("other").Parse(t2src))
_

次に、ここで何が起こるかというと、新しい_template.Template_値をtに割り当てました。これは、_t2src_を解析した結果であり、これがデフォルトになりますが、両方のテンプレートを「それらが関連付けられているので、そこから到達しました。出力がこれに変わります( Go Playground で試してください):

_I'm some OTHER template.
I'm some template.
I'm some OTHER template.
_

template.New()(function)を呼び出すと、noneに関連付けられた新しいテンプレートが作成されます。 Template.New()(メソッド)を呼び出すと、返されるテンプレートは、メソッドが呼び出される(すべての)テンプレートに関連付けられます。

次に、「埋め込み」テンプレートに関するいくつかの例を見てみましょう。

_func main() {
    t := template.Must(template.New("one").Parse(t1src))
    template.Must(t.New("other").Parse(t2src))
    template.Must(t.New("third").Parse(t3src))

    t.Execute(os.Stdout, nil)
    t.ExecuteTemplate(os.Stdout, "one", nil)
    t.ExecuteTemplate(os.Stdout, "other", nil)
    t.ExecuteTemplate(os.Stdout, "embedded", nil)
    t.ExecuteTemplate(os.Stdout, "third", nil)
}

const t1src = `I'm some template. {{block "embedded" .}}I'm embedded in "one".
{{end}}`
const t2src = `I'm some OTHER template.
`
const t3src = `I'm the 3rd, including everything from "one": {{template "one"}}
`
_

出力( Go Playground で試してください):

_I'm some template. I'm embedded in "one".
I'm some template. I'm embedded in "one".
I'm some OTHER template.
I'm embedded in "one".
I'm the 3rd, including everything from "one": I'm some template. I'm embedded in "one".
_

これで、テンプレート名の役割とその由来が明らかになるはずです。

32
icza

関連するテンプレートをレンダリングするために使用されます。

例えば:

_tmpl := template.Must(template.New("body").Parse(`
    {{ define "body" }}
       Body
    {{ end }}
    `))

tmpl = template.Must(tmpl.New("base").Parse(`
     Start of base template

     {{ template "body" }}

     End of base template
    `))

tmpl = template.Must(tmpl.New("baz").Parse(`
     Start of baz template

     {{ template "body" }}

     End of baz template
    `))

tmpl.ExecuteTemplate(os.Stdout, "base", nil)
tmpl.ExecuteTemplate(os.Stdout, "baz", nil)
_

プレイ例

出力:

_     Start of base template


       Body


     End of base template

     Start of baz template


       Body


     End of baz template
_

tmpl.ExecuteTemplate(os.Stdout, "base", nil)は、「ベース」テンプレートを使用してテンプレートをレンダリングします

tmpl.ExecuteTemplate(os.Stdout, "baz", nil)は、「baz」テンプレートを使用してテンプレートをレンダリングします

4
jmaloney