【问题标题】:What is a template cache?什么是模板缓存?
【发布时间】:2022-09-28 03:32:34
【问题描述】:

我对我通过观看 golang 课程编写的代码感到困惑。请解释一下*template.Template 会包含什么?它被称为模板缓存,那么这到底是什么?为什么config.goTemplateCache 字段而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


【解决方案1】:

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

树是单个已解析模板的表示。

至于你关于TemplateCache 是什么的问题,就像听起来一样。

在计算中,缓存是一种高速数据存储层,用于存储数据的子集

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

RenderTemplate 函数的幼稚版本将在每次调用所有不同处理程序中的每个请求之后调用它,但 RenderTemplate 函数的作用是它在@987654328 中的应用程序开始时仅被调用一次@ 并构建所有模板并将它们存储在TemplateCache 以供将来使用。

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2010-09-19
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多