如何在gin框架中自定义模板函数。
在gin框架中,我们可以使用Go语言自带的html/template模块来进行模板渲染。
html/template模块提供了一系列的内置函数,如eq、ne、and、or等等,但是有时候我们需要自定义一些函数来满足我们的需求,比如计算字符串的MD5值等。
我们可以通过 SetFuncMap 方法将自定义函数注册到模板引擎中,使其能够在模板中使用。这个方法接收一个 FuncMap 类型的参数,它是一个映射表,其中键为自定义函数的名称,值为自定义函数本身。这样,我们就可以在模板中通过函数名来调用自定义函数,从而实现一些特殊的功能。
自定义模板函数的使用场景非常广泛,例如我们可以定义一个格式化时间的函数,将时间戳转换为人类易读的格式,或者定义一个计算字符串长度的函数,帮助我们在模板中进行一些字符串操作等等。
下面我们来看一下如何在gin框架中自定义模板函数,分享两个案例一个是本人在学习中用到的,一个是在网上看见的案例;
案例一:定义一个格式化时间的函数
在main.go 主入口文件中定义,需要自定义模版函数;
package main
import (
"github.com/gin-gonic/gin"
"html/template"
"net/http"
"time"
)
// 定一个函数,这里就是我们自定义的函数了
func UnitTime(timestamp int) string {
t := time.Unix(int64(timestamp), 0)
return t.Format("2006-01-02 15:09:01")
}
func main() {
// 定义一个路由引擎
r := gin.Default()
//自定义函数 渲染 注入模版 使用 router.SetFuncMap(template.FuncMap{}) 这个里面用到的包"html/template",就是一个第三方自定义函数包名称,负责渲染模版函数template到html内;
r.SetFuncMap(template.FuncMap{
"UnitTime": UnitTime,
})
// 加载 渲染模版
r.LoadHTMLGlob("*templates/**/*")
// 创建 路由
r.GET("/", func(ctx *gin.Context) {
new := &Article{
Title: "admin/index",
Content: "这是一个首页后台管理",
}
ctx.HTML(http.StatusOK, "default/index.html", gin.H{
"title": "首页",
"msg": "lll",
"news": new,
"score": 100,
"list": []string{"吃饭", "睡觉", "写代码"}, // 数组
"scoreList": []interface{}{
&Article{
Title: "新闻一",
Content: "新闻内容11111",
},
&Article{
Title: "新闻二",
Content: "新闻内容2222",
},
},
"data": 1686593382, //时间戳
})
})
//启动服务
r.Run(":8001")
}
同时,我们需要在使用模版templates/default/index.html内使用它,以下就是html使用代码:
{
{ define "default/index.html" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>default/index.html</title>
<link rel="stylesheet" href="/static/css/index.css">
</head>
<body>
<h2>实际开发常用函数,自定义函数 </h2>
<p>
{
{UnitTime .data }}
</p>
<p style="font-size:14px;color: red;">{
{.data | UnitTime}}</p>
</body>
</html>
{
{end}}
注意⚠️这里 "html/template"包,"html/template"是 Go 语言标准库中的一个包,用于生成 HTML 页面。它提供了一种安全的方式来呈现动态数据,避免了常见的 XSS(跨站脚本攻击)漏洞。在模板中,可以使用变量、控制结构和函数等来组织页面的结构和内容。
注解:"html/template"是 Go 语言标准库中的一个包,用于生成 HTML 页面。它提供了一种安全的方式来呈现动态数据,避免了常见的 XSS(跨站脚本攻击)漏洞。在模板中,可以使用变量、控制结构和函数等来组织页面的结构和内容。同时,"html/template"还支持模板继承、局部模板和pipeline等高级特性,可以帮助我们更方便地构建复杂的 HTML 页面。
案例二:定一个加密函数
首先,在我们的项目中创建一个名为
funcMap.go的文件,用来存放我们自定义的模板函数,代码如下:
package main
import (
"crypto/md5"
"encoding/hex"
"html/template"
)
// 定义一个计算字符串MD5值的函数
func md5V(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}
// 初始化自定义函数
func InitFuncMap() template.FuncMap {
funcMap := template.FuncMap{
"md5": md5V,
}
return funcMap
}
在上面的代码中,我们定义了一个名为md5V 的函数,用来计算字符串的MD5值。然后我们通过
InitFuncMap 函数来初始化我们的自定义函数md5,并将其放入template.FuncMap中。
接着,在我们的模板文件中使用自定义函数,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{
{.Title}}</title>
</head>
<body>
<p>{
{.Content}}</p>
<p>计算md5值:{
{md5 .Content}}</p>
</body>
</html>
如果我们想在模板中使用自定义函数,需要将这些函数注册到 "html/template" 包的 FuncMap 中。通常情况下,我们会将自定义函数和模板分别存放在不同的文件中,然后在程序初始化的时候将它们加载进来。
当然方法不止一种,就以上两种使用都是可以的,可以根据个人喜好去选择。
同时对第二个场景补充说明一下这个场景下使用的具体另一种实现
假设我们在项目中有一个名为 "funcs.go" 的文件,其中定义了一个名为 "double" 的自定义函数:
package main
import (
"html/template"
)
// 自定义函数,将传入的整数翻倍
func double(x int) int {
return x * 2
}
// 初始化模板,注册自定义函数
var tmpl = template.Must(template.New("").Funcs(template.FuncMap{
"double": double,
}).ParseFiles("template.html"))
// 渲染模板
func renderTemplate(data interface{}) error {
err := tmpl.ExecuteTemplate(os.Stdout, "template.html", data)
if err != nil {
return err
}
return nil
}
在上面的代码中,我们将 "double" 函数注册到 "html/template" 包的 FuncMap 中,并且使用 "template.Must" 函数初始化了模板。在模板文件 "template.html" 中,我们可以像这样使用 "double" 函数:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Template</title>
</head>
<body>
<p>{
{ double . }}</p>
</body>
</html>
在上面的模板中,我们使用了点号 "." 来表示当前数据对象,然后通过 "double ." 的方式调用了自定义函数。当我们调用 "renderTemplate" 函数时,会将数据对象传入模板中进行渲染,并输出结果。
希望这能够帮到你,可以给博主点个赞!!!