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

har*_*ass 7 go

要处理Web应用程序中的每个请求,有关模板的常规代码如下所示:

t:= template.New("welcome")
t, _ = t.ParseFiles("welcome.tpl")
t.Execute(w, data)
Run Code Online (Sandbox Code Playgroud)

我想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)
Run Code Online (Sandbox Code Playgroud)

我想通过将模板放入地图或缓存来提高效率是可行的还是可行的?我也想知道函数 Execute是否是线程安全的?

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

and*_*olm 13

模板实际上可以作为模板的映射.这是我做的:

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

var t = template.New("master")
Run Code Online (Sandbox Code Playgroud)

我实际上并没有使用"主"模板,除了作为其他模板的容器.

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

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

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

t.ExecuteTemplate(w, "user.html", data)
Run Code Online (Sandbox Code Playgroud)