Go模板生命周期

Go Template Lifecycle

在我的 Go 模板中,我有一个名为“asset”的函数:

<html>
  {{ asset "application.css" }}
</html>

这个函数打开一个webpackmanifest.json并找到对应的散列文件:

func asset(s string) string {
  data, _ := ioutil.ReadFile("manifest.json")
  // do stuff with data
  return filename
}

我的问题是关于对性能的影响。这个函数什么时候被调用?是每次执行模板时去打开manifest文件;每次用户访问页面?还是在初始 template.New("").ParseFiles() 调用时调用?

在应用程序启动时打开文件并将文件名映射存储在全局变量中会更好吗?这对我来说更有意义,但处理这个问题的最佳方法是什么?

每次执行模板都会调用注册的asset()函数,因此每次都会打开读取文件"manifest.json"

如果它的内容没有改变,只加载它一次,在第一次使用时,或者更好的是,在应用程序启动时,这可能是在包初始化期间(在包 init() 函数中)。

如果这样做,您可以将 filename 传递给模板执行,因此甚至不需要注册自定义函数。