我应该在每个http请求上调用template.ParseFiles(...)还是只从main函数调用一次?

问题描述 投票:-2回答:1

我正在使用包html/template的go编程语言进行一些web开发。在代码的某些方面,我需要调用函数template.ParseFiles(...),这样我就可以从这些文件ad创建一个模板,然后使用temp.Execute(w,data)执行它。我想知道是否最好在每个请求上创建模板,或者在main中执行一次并声明一个全局变量。

现在我在我的句柄功能的每个请求上都这样做,就像大多数教程一样。但是,我不知道如果我通过在每个请求上执行它而不是将它们作为全局变量来浪费资源。

这就是每个请求的外观

func ViewStats(w http.ResponseWriter, r *http.Request) {
    //Get stuff from db and put them in data
    //...
    //return data to user
    tmp, err := template.ParseFiles("views/guest-layout.html",
        "views/stats.html")

    if err != nil {
        fmt.Println(err)
    } else {
        tmp.Execute(w,data)
    }
}

我想知道这是否更好:

var temp1 template.Template

func main() {
    temp1, err = template.ParseFiles("file1","file2") 
    //...
}
performance go go-templates
1个回答
1
投票

像往常一样:这取决于。

但首先是一些细微差别:

  1. 你永远不应该在你的main()函数中进行模板解析(或其他任何有趣的事情)。相反,你的main()函数应该调用方法(或单个方法)来启动程序中有趣的事物链。
  2. Go没有全局变量,所以它实际上不是一个选项,可以将解析后的模板存储在全局变量中。最接近Go的全局变量是包变量。您可以将解析后的模板存储在main包中的包变量中,但这也是不好的形式,因为你的main包(除了微小的,琐碎的程序)应该只是一个入口点,否则几乎是空的。

但现在,问题的核心是:

你应该为每个请求或每次运行解析模板吗?

这取决于它。

如果您有经常更改的模板(即在开发期间,当您不断编辑HTML文件时),则每个请求最好一次。

但这远远不如仅解析一次,因此在生产中,您可能希望仅在启动时解析模板一次。然后,您可以将模板存储在包变量中,或者更好地存储在运行时初始化的结构中。但我把它留给你。

但最好的方法实际上是两种方法之间的妥协。最好在启动时加载模板,并偶尔重新加载它们(例如,每5分钟一次),或者观察文件系统,并在模板的磁盘表示发生变化时重新加载它们。

如何做到这一点留给读者练习。

© www.soinside.com 2019 - 2024. All rights reserved.