很多人都说golang不太适合做网页渲染逻辑。如果与PHP相比,golang在这方面确实在开放上不是显得方便。当你的模板出现错误时,在go运行时层一般会发生恐慌,导致当前请求失败。不仅如此,本身golang所提供的模板库性能也并非理想。当你在模板中出现一个小小的错误就会导致整个请求失败。
在逛github时,发现一个不错的模板引擎。根据作者所提供的benchmark结果,其关注的性能还是相当高的。有兴趣的同学可以到其官方主页中运行相应的测试用例。https://github.com/CloudyKit/jet
这次博客更新一部分功能,其模板渲染器就换掉了go所提供的模板引擎,改为了jet。使用起来感觉还可以,没有遇到太多麻烦。鉴于国内并么有太多人关注该库,特意将Jet的文档进行一部分汉化说明。
如果你要使用jet模板引擎,建议你直接使用最新的V2版本。相比较老版本而言,新版本的借口更加简单,解析速度也更快一些。
安装
go get -u github.com/CloudyKit/jet
创建一个模板渲染对象并制定模板所在目录
import (
    "os"
    "path/filepath"
    "github.com/CloudyKit/jet"
)
var View = jet.NewHTMLSet("./views")) // relative to the current working directory from where this code is run
// may also use an absolute path:
var root, _ = os.Getwd()
var View = jet.NewHTMLSet(filepath.Join(root, "views"))
jet比较省事的一点是,你只要制定所有模板所在的文件夹,它就会在该文件夹内寻找所需要的文件。无论是你制定的当前所要渲染的文件,还是模板中相对依赖的文件。它都能自动查找。
创建模板文件
<!-- file: "views/layouts/application.jet" -->
<!DOCTYPE html>
<html>
  <head></head>
  <body>
    {{yield body()}}
  </body>
</html>
<!-- file: "views/home.jet" -->
{{extends "layouts/application.jet"}}
{{block body()}}
  <main>
    This content will be yielded in the layout above.
  </main>
{{end}}
渲染模板
jet.VarMapmap[string]reflect.Valueio.Writer
templateName := "home.jet"
t, err := View.GetTemplate(templateName)
if err != nil {
    // template could not be loaded
}
var w bytes.Buffer // needs to conform to io.Writer interface (like gin's context.Writer for example)
vars := make(jet.VarMap)
if err = t.Execute(&w, vars, nil); err != nil {
    // error when executing template
}
home.jetw