7

Web アプリケーションですべてのリクエストを処理するために、テンプレートに関する通常のコードは次のようになります。

t:= template.New("welcome")
t, _ = t.ParseFiles("welcome.tpl")
t.Execute(w, data)

ParseFiles毎回かなりの出費だったと思います。テンプレートの再利用は可能ですか?そこで、次のように改善しました。

//templateMap := make(map[string][template])
//...
tplName :="welcome"
t := templateMap[tplName]
if t=nil{
    t:= template.New(tplName )
    t, _ = t.ParseFiles("welcome.tpl")
    templateMap[tplName] = t
}

t.Execute(w, data)

テンプレートをマップまたはキャッシュに入れることで効率を改善することは可能でしょうか? 関数 Executeがスレッドセーフかどうかも疑問です。

func (t *Template) Execute(wr io.Writer, data interface{}) (err error)

4

3 に答える 3

0

template.go のソース コードから、Execute 関数はロックを使用します。私は初心者です。スレッド セーフに見えますが、必要に応じてテンプレート インスタンスをマップに配置して再利用しようとすると、効率が低下する可能性があります。多くの同時リクエストを処理します:

func (t *Template) Execute(wr io.Writer, data interface{}) (err error) {
        t.nameSpace.mu.Lock()
        if !t.escaped {
                if err = escapeTemplates(t, t.Name()); err != nil {
                        t.escaped = true
                }
        }
        t.nameSpace.mu.Unlock()
        if err != nil {
                return
        }
        return t.text.Execute(wr, data)
}
于 2013-03-12T03:04:52.250 に答える