一尘不染

是否有必要将模板放入地图中以便在Go中重复使用?

go

为了处理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)


阅读 177

收藏
2020-07-02

共1个答案

一尘不染

模板本身实际上可以充当模板的映射。这是我的工作:

我声明一个全局模板变量:

var t = template.New("master")

除了用作其他模板的容器之外,我实际上没有使用“主”模板。

然后,在我的应用启动时加载所有模板:

func init() {
    _, err := t.ParseGlob("templates/*.html")
    if err != nil {
        log.Fatalln("Error loading templates:", err)
    }
}

然后,当我想使用其中一个模板时,请按名称要求:

t.ExecuteTemplate(w, "user.html", data)
2020-07-02