【发布时间】:2022-09-28 03:32:34
【问题描述】:
我对我通过观看 golang 课程编写的代码感到困惑。请解释一下*template.Template 会包含什么?它被称为模板缓存,那么这到底是什么?为什么config.go 有TemplateCache 字段而RenderTemplate 指的是它?我猜这是依赖注入,到目前为止,依赖注入和指针对我来说是 golang 中最令人困惑的事情
渲染.go
var functions = template.FuncMap{}
var app *config.AppConfig
// NewTemplates sets the config for the template package
func NewTemplates(a *config.AppConfig) {
app = a
}
// RenderTemplate
func RenderTemplate(w http.ResponseWriter, tmpl string) {
var tc map[string]*template.Template
// if statement enables development mode
if app.UseCache {
//get the template cache from the app config
tc = app.TemplateCache
} else {
tc, _ = CreateTemplateCache()
}
t, ok := tc[tmpl]
if !ok {
log.Fatal(\"couldnt get template from template cache in render.go (37)\")
}
buf := new(bytes.Buffer)
_ = t.Execute(buf, nil)
_, err := buf.WriteTo(w)
if err != nil {
fmt.Println(\"Error writing template to browser in render.go (44)\", err)
}
}
// CreateTemplateCache creates template cache as a map
func CreateTemplateCache() (map[string]*template.Template, error) {
myCache := map[string]*template.Template{}
pages, err := filepath.Glob(\"./templates/*page.html\")
fmt.Println(\"List of all pages that matches \'*page.html\': \", pages)
if err != nil {
return myCache, err
}
for _, page := range pages {
name := filepath.Base(page)
fmt.Println(\"Page is currently\", page)
fmt.Println(\"template.New return value: \", template.New(name))
ts, err := template.New(name).Funcs(functions).ParseFiles(page)
if err != nil {
return myCache, err
}
matches, err := filepath.Glob(\"./templates/*.layout.html\")
if err != nil {
return myCache, err
}
if len(matches) > 0 {
ts, err = ts.ParseGlob(\"./templates/*.layout.html\")
if err != nil {
return myCache, err
}
}
myCache[name] = ts
}
return myCache, nil
}
配置文件
// AppConfig holds the application config
type AppConfig struct {
UseCache bool
TemplateCache map[string]*template.Template
}
-
模板缓存存在,因此模板只需编译一次。没有它,必须为每个请求重复编译相同的模板,浪费 CPU 周期。
标签: go