我想根据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))
}
}