Go语言中的gin框架学习模版渲染之自定义模版函数(四)

如何在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" 函数时,会将数据对象传入模板中进行渲染,并输出结果。

希望这能够帮到你,可以给博主点个赞!!! 

猜你喜欢

转载自blog.csdn.net/A_LWIEUI_Learn/article/details/131198318