登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-13 12:12:33 143浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《我应该在每个 http 请求上调用 template.ParseFiles(...) 还是只从 main 函数调用一次?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在使用 go 编程语言使用 html/template 包进行一些 web 开发。在代码的某个时刻,我需要调用函数 template.parsefiles(...) ,以便我可以从这些文件创建模板,然后使用 temp.execute(w,data) 执行它。我想知道是在每个请求上创建模板更好还是在主程序中创建一次并声明一个全局变量更好。

现在,我对句柄函数的每个请求都执行此操作,就像大多数教程一样。但是,我不知道在每个请求上执行此操作而不是将它们作为全局变量是否会浪费资源。

这是每个请求的样子

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") 
    //...
}

解决方案


像往常一样:这取决于。

但首先有一些细微差别:

  1. 您永远不应该在 main() 函数中进行模板解析(或任何其他有趣的事情)。相反,您的 main() 函数应该调用方法(或单个方法)来启动程序中一系列有趣的事情。

  2. Go 没有全局变量,因此实际上并不是将解析后的模板存储在全局变量中的选项。 Go 最接近全局变量的是包变量。您可以将解析后的模板存储在 main 包中的包变量中,但这也是不好的形式,因为您的 main 包(除了微小的、琐碎的程序)应该只是一个入口点,并且否则几乎是空的。

但是现在,谈谈你问题的核心:

您应该根据请求还是每次运行来解析模板?

这取决于情况。

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

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

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

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

本篇关于《我应该在每个 http 请求上调用 template.ParseFiles(...) 还是只从 main 函数调用一次?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>