4

<br/>目標: 改行をいくつかの文字列のタグに変更したい HTTP サーバーで複数のテンプレートを使用します。

簡素化された例:

2 つのテンプレートがa.tmplあり、b.tmpl次のようになります。

Template a {{dosomething}}

(他のテンプレートも同様です)。どちらも というディレクトリにありtemplatesます。\n-><br />置換 (dosomething上記)を行う関数を作成する必要があると思います。

これは私の(動作していない)サンプルコードです:

package main

import (
    "log"
    "text/template"
)

func main() {
    // funcMap := template.FuncMap{
    //  "dosomething": func() string { return "done something" },
    // }

    templates, err := template.ParseGlob("templates/*.tmpl")
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("%#v", templates)

}

エラーメッセージは次のとおりです。

2013/03/04 20:08:19 template: a.tmpl:1: function "dosomething" not defined
exit status 1

これは理にかなっています。なぜなら、解析中は関数dosomethingがわからないからです。

  1. 複数のテンプレートで関数を使用するにはどうすればよいですか? この質問への答えはここにあるので、唯一の方法ですか?
  2. これは正しいアプローチですか?ドキュメントのタイトルの例のように、いくつかの文字列のテキストを変更したいことを思い出してください ( http://golang.org/pkg/text/template/#FuncMap - Example (Func))?
  3. b.tmpl次のコードで アクセスするにはどうすればよいですか。

    package main
    
    import (
        "log"
        "text/template"
    )
    
    func main() {
        funcMap := template.FuncMap{
            "dosomething": func() string { return "done something" },
        }
    
        t, err := template.New("a.tmpl").Funcs(funcMap).ParseGlob("templates/*.tmpl")
        if err != nil {
            log.Fatal(err)
        }
        log.Printf("%#v", t)
    }
    
4

1 に答える 1

3

コードの最後のスニペットは、私にはほぼ正しいように見えます。

b.tmpl をレンダリングするには、単に呼び出します

t.ExecuteTemplate(w, "b.tmpl", data)

同じ方法で a.tmpl にアクセスできます。New の呼び出しで名前を「a.tmpl」に設定するのではなく、一貫性を保つためにこれを行うことをお勧めします。

于 2013-03-04T20:59:34.820 に答える