gpt4 book ai didi

go - 什么是模板缓存?

转载 作者:行者123 更新时间:2023-12-02 01:28:32 26 4
gpt4 key购买 nike

我对通过观看 golang 类(class)编写的这段代码感到困惑。请解释一下 *template.Template 包含什么?它被称为模板缓存,那么这到底是什么?为什么 config.goTemplateCache 字段并且 RenderTemplate 引用它?我猜这是依赖注入(inject),到目前为止,依赖注入(inject)和指针是 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
}

config.go

// AppConfig holds the application config
type AppConfig struct {
UseCache bool
TemplateCache map[string]*template.Template
}

最佳答案

根据 pkg.go.dev 的文档Template 是一个结构体,包含一个名为 Tree 且类型为 *parse.Tree 的字段。如果我们去解析包,我们会看到

Tree is the representation of a single parsed template.

至于您关于 TemplateCache 是什么的问题,正如听起来的那样。

In computing, a cache is a high-speed data storage layer which stores a subset of data

因此,TemplateCache 存储模板以供将来使用和访问。当 RenderTemplate 运行时,它使用 html/tmpl 文件从头开始构建模板,并将其构建为 Go 可以使用和渲染的格式 (template.Template)。

RenderTemplate 函数的简单版本会在每次调用所有不同处理程序中的每个请求后调用它,但 RenderTemplate 函数的作用是仅在 main.go 中的应用程序开头调用一次,并构建所有模板并将它们存储在 TemplateCache 中以供将来使用。

关于go - 什么是模板缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73847331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com