iris内置的模板引擎语言和标签,默认是不支持使用golang的函数的。但有时候,我们又需要在模板中处理一些变量。这个时候我们就需要手动给模板引擎添加自定义函数了。给模板引擎添加自定义函数的方法很简单,先是写好函数,然后将函数添加到模板引擎就可以了。

下面我们以给模板添加一个时间格式化函数为例,说明给模板引擎添加函数的方法。我们先在bootstrap.go 中,添加下面的方法:

func TimestampToDate(in int64, layout string) string {
    t := time.Unix(in, 0)
    return t.Format(layout)
}

这个函数的意思就是接受一个时间戳,和一个格式化模板,格式化模板采用golang的时间格式化模板。然后根据传入的时间戳,格式化成传入的时间格式化模板的样子输出。

然后将它添加到模板引擎中。我们在Serv函数的模板引擎部分代码中加入:

func (bootstrap *Bootstrap) Serve() {
    bootstrap.Application.Logger().SetLevel(bootstrap.LoggerLevel)

    bootstrap.LoadRoutes()

    pugEngine := iris.Django("./template", ".html")
    if config.ServerConfig.Env == "development" {
        //测试环境下动态加载
        pugEngine.Reload(true)
  }
  //这一行是新加的代码
    pugEngine.AddFunc("stampToDate", TimestampToDate)
    bootstrap.Application.RegisterView(pugEngine)

    bootstrap.Application.Run(
        iris.Addr(fmt.Sprintf("127.0.0.1:%d", bootstrap.Port)),
        iris.WithoutServerError(iris.ErrServerClosed),
        iris.WithoutBodyConsumptionOnUnmarshal,
    )
}

这里我们添加了一个 函数名为 stampToDate 的函数,模板调用这个函数的时候,就会对应的执行上面我们定义的 TimestampToDate 函数。下面是我们在模板中使用的方法:

{{stampToDate(1607336185, "2006-01-02 15:04:05")}}

这个模板代码将输出的结果为:

2020-12-07 18:16:25

为了验证结果,我们现在将它输出在IndexPage 中。我们在IndexPage函数中添加一行代码:

func IndexPage(ctx iris.Context) {
    nowStamp := time.Now().Unix()
    ctx.ViewData("nowStamp", nowStamp)

    ctx.View("index.html")
}

然后在index.html文件中,放置上面提到的模板引擎代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello World</title>
</head>
<body>
Hello World!<br>
{{stampToDate(nowStamp, "2006-01-02 15:04:05")}}
</body>
</html>

依然是重新运行代码,在浏览器中看结果:
运行结果

如果不出意外,你看到的就是包括了年月日时分秒的时间。

同样的,我们还可以输出更多的时间格式,比如

去掉秒
{{stampToDate(nowStamp, "2006-01-02 15:04")}}<br>
去掉时分秒
{{stampToDate(nowStamp, "2006-01-02")}}<br>
加上中文年月日时分秒
{{stampToDate(nowStamp, "2006年01月02日15时04分05秒")}}<br>
格林威治时间
{{stampToDate(nowStamp, "Mon Jan 2 15:04:05 -0700 MST 2006")}}<br>

再次刷新浏览器,查看结果。这个时候,如果前面我们设置了动态加载模板development,则我们不需要重启项目,就可以通过刷新浏览器查看到新的改动了。因为我们只改动了模板,它会自动在每次我们刷新页面的时候,重载模板。
运行结果:
运行结果

完整的项目示例代码托管在GitHub上,需要查看完整的项目代码可以到github.com/fesiong/goblog 上查看,也可以直接fork一份来在上面做修改。