默认的 template.Must(template.ParseFiles(urls...)) 会解析指定文件并创建模板对象,但不会自动缓存。每次调用都会重新解析文件。要实现缓存,可以手动管理模板映射。
示例代码:
package main
import (
"html/template"
"sync"
)
type TemplateCache struct {
mu sync.RWMutex
templates map[string]*template.Template
}
func NewTemplateCache() *TemplateCache {
return &TemplateCache{
templates: make(map[string]*template.Template),
}
}
func (c *TemplateCache) Get(name string) (*template.Template, error) {
c.mu.RLock()
tmpl, ok := c.templates[name]
c.mu.RUnlock()
if ok {
return tmpl, nil
}
c.mu.Lock()
defer c.mu.Unlock()
// 双重检查
if tmpl, ok := c.templates[name]; ok {
return tmpl, nil
}
tmpl, err := template.ParseFiles(name)
if err != nil {
return nil, err
}
c.templates[name] = tmpl
return tmpl, nil
}
func main() {
cache := NewTemplateCache()
// 使用缓存获取模板
tmpl, err := cache.Get("index.html")
if err != nil {
panic(err)
}
// 执行模板
_ = tmpl.Execute(w, data)
}
template.ParseFiles 会解析文件内容,构建模板的抽象语法树,分配相应的内存结构。模板对象包含解析后的文本段、动作指令和关联数据。