7.11. 模板缓存

代码中有一个低效率的地方:每次显示一个页面,renderTemplate都要调用ParseFile。更好的做法是在程序初始化的时候对每个模板调用ParseFile一次,将结果保存为*Template类型的值,在以后使用。

首先,我们创建一个全局map,命名为templates。templates用于储存*Template类型的值,使用string索引。

然后,我们创建一个init函数,init函数会在程序初始化的时候调用,在main函数之前。函数template.MustParseFile是ParseFile的一个封装,它不返回错误码,而是在错误发生的时候抛出(panic)一个错误。抛出错误(panic)在这里是合适的,如果模板不能加载,程序唯一能做的有意义的事就是退出。

  func init() { for _, tmpl := range []string{"edit", "view"} { templates[tmpl] = template.MustParseFile(tmpl+".html", nil) } }

使用带range语句的for循环访问一个常量数组中的每一个元素,这个常量数组中包含了我们想要加载的所有模板的名称。如果我们想要添加更多的模板,只要把模板名称添加的数组中就可以了。

修改renderTemplate函数,在templates中相应的Template上调用Execute方法:

  func renderTemplate(w http.ResponseWriter, tmpl string, p *page) {
      err := templates[tmpl].Execute(p, w)
      if err != nil {
          http.Error(w, err.String(), http.StatusInternalServerError)
      }
  }