31

Funcsと を使用しようとすると、Go テンプレートで奇妙なことに気付きましたFuncMap。次のコードは期待どおりに機能します。

buffer := bytes.NewBufferString("")

funcMap := template.FuncMap{
    "label": strings.Title,
}

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "")

return string(buffer.Bytes()) //=> "Alex"

しかし、テンプレートをファイルに入れようとすると、機能しません (Execute()言う: "alex" is an incomplete or empty template):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

template.html を使用:

{{label \"alex\"}}

理由はありますか?これはバグですか?テンプレートでメソッド/関数を使用する簡単な方法はありますか?

4

3 に答える 3

34

ParseFiles は、おそらくより適切なドキュメントを使用できます。テンプレート オブジェクトには複数のテンプレートを含めることができ、それぞれに名前があります。ParseFiles の実装を見ると、ファイル名がテンプレート オブジェクト内のテンプレート名として使用されていることがわかります。そのため、ファイルにテンプレート オブジェクトと同じ名前を付けるか (おそらく一般的には実用的ではありません)、または Execute の代わりに ExecuteTemplate を使用します。

于 2012-04-17T22:31:37.037 に答える
16

ソニアの答えは技術的には正しいですが、私はさらに混乱しました。これが私が最終的にそれを機能させた方法です:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html")
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
    return
}
err = t.Execute(w, data)
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
}

テンプレートの名前は、完全なパスではなく、テンプレートのそのままのファイル名です。Execute一致する名前が付けられていれば、デフォルトのテンプレートが実行されるため、 を使用する必要はありませんExecuteTemplate

この場合、_base.htmlfile は最も外側のコンテナーです。たとえば、次のようになります。

<!DOCTYPE html>
<html><body>
<h1>{{ template "title" }}</h1>
{{ template "content" }}
</body></html>

whilehome.htmlは特定の部分を定義します:

{{ define "title" }}Home{{ end }}

{{ define "content" }}
Stuff
{{ end }}
于 2014-01-01T20:08:03.323 に答える
0

最初にすべてのファイルを解析して実行する必要があります。すべてのファイルに直接アクセスすることはできません。

于 2020-02-17T06:13:04.457 に答える