我想根据http错误代码执行其他模板。

我当时在考虑使用template.ParseFiles(),但是我很困惑如何动态地执行此操作。实际上,ParseFiles()可以加载字符串数组(文件名)。

为了将其结果分配给映射中的错误代码,是否必须分别为每个文件添加ParseFiles()?如果我全部将ParseFiles()放入一个数组中,那么如何将每个模板分配给错误代码?

我想避免每次请求都必须使用ParseFiles(),而是希望仅在请求时使用init()Execute进行解析。

这是我到目前为止的内容(尚未编译):

package main

import (
    "os"
    "html/template"
    "net/http"
)

var templateMap map[int]*template.Template

func init() {
  initErrHandling()
}

func initErrHandling() {

  templateMap = make(map[int]*template.Template)
  templateMap[0]   = "generic.html" //default
  templateMap[400] = "generic.html"
  templateMap[401] = "unauthorized.html"
  templateMap[403] = "forbidden.html"
  templateMap[404] = "notfound.html"
  templateMap[422] = "invalidparams.html"
  templateMap[500] = "generic.html"

  template.ParseFiles() //parseFiles all files in one call, or parseFiles one by one and assign to error code, e.g. templateMap[404],_ = template.parseFiles("notfound.html")?
}


func getTemplate(code int) (*template.Template) {
  if val, tmpl := templateMap[code]; tmpl {
    return tmpl
  } else {
    return templateMap[0]
  }
}

func showError(w http.ResponseWriter, code int) {
    getTemplate(code).Execute(w)
}

func main() {
    showError(os.Stdout, 400)
}

最佳答案

使用一个映射来记录文件名,使用第二个映射来分析模板:

func initErrHandling() {  // call from init()
  fnames := map[int]string{
    0:   "generic.html", //default
    400: "generic.html",
    401: "unauthorized.html",
    403: "forbidden.html",
    404: "notfound.html",
    422: "invalidparams.html",
    500: "generic.html",
  }
  templateMap = make(map[int]*template.Template)
  for code, fname := range fnames {
    templateMap[code] = template.Must(template.ParseFiles(fname))
  }

}

09-25 20:34