El marco gin en el lenguaje Go aprende funciones de plantilla personalizadas para la representación de plantillas (4)

Cómo personalizar funciones de plantilla en gin framework.

En el marco gin, podemos usar el módulo html/template que viene con el lenguaje Go para la representación de plantillas.
El módulo html/template proporciona una serie de funciones integradas, como eq, ne, and, or, etc., pero a veces necesitamos personalizar algunas funciones para satisfacer nuestras necesidades, como calcular el valor MD5 de una cadena.

Podemos registrar funciones personalizadas en el motor de plantillas a través del método SetFuncMap para que puedan usarse en plantillas. Este método recibe un parámetro de tipo FuncMap, que es una tabla de mapeo en la que la clave es el nombre de la función personalizada y el valor es la función personalizada en sí. De esta manera, podemos llamar a funciones personalizadas a través del nombre de la función en la plantilla para lograr algunas funciones especiales.

Los escenarios de uso de funciones de plantilla personalizadas son muy amplios. Por ejemplo, podemos definir una función que formatea la hora, convierte la marca de tiempo a un formato legible por humanos o define una función que calcula la longitud de una cadena para ayudarnos a agregar algunos caracteres. en la plantilla Operaciones de cadena, etc.

Echemos un vistazo a cómo personalizar funciones de plantilla en el marco gin. Compartamos dos casos: uno es uno que utilicé en mi estudio y el otro es un caso que vi en línea;

Caso 1: Definir una función que formatea la hora

Definido en el archivo de entrada principal main.go, se requiere una función de plantilla personalizada;

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")
}

 Al mismo tiempo, debemos usarlo en la plantilla templates/default/index.html, el siguiente es el código de uso 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}}

Nota⚠️El paquete " html/template " aquí, " html/template " es un paquete en la biblioteca estándar del lenguaje Go, que se utiliza para generar páginas HTML. Proporciona una forma segura de representar datos dinámicos, evitando vulnerabilidades comunes de XSS (cross-site scripting). En una plantilla, puedes utilizar variables, estructuras de control, funciones, etc. para organizar la estructura y el contenido de la página.

Nota : "html/template" es un paquete de la biblioteca estándar del lenguaje Go, que se utiliza para generar páginas HTML. Proporciona una forma segura de representar datos dinámicos, evitando vulnerabilidades comunes de XSS (cross-site scripting). En una plantilla, puedes utilizar variables, estructuras de control, funciones, etc. para organizar la estructura y el contenido de la página. Al mismo tiempo, "html/template" también admite funciones avanzadas como herencia de plantillas, plantillas parciales y canalizaciones, que pueden ayudarnos a crear páginas HTML complejas más fácilmente.

Caso 2: Definir una función de cifrado


Primero, cree un archivo llamado funcMap.go en nuestro proyecto para almacenar nuestras funciones de plantilla personalizadas. El código es el siguiente:

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
}

En el código anterior, definimos una función llamada md5V para calcular el valor MD5 de una cadena. Luego inicializamos nuestra función personalizada md5 a través de la función
InitFuncMap y la colocamos en template.FuncMap.

A continuación, use la función personalizada en nuestro archivo de plantilla, el código es el siguiente:


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{
   
   {.Title}}</title>
</head>
<body>
    <p>{
   
   {.Content}}</p>
    <p>计算md5值:{
   
   {md5 .Content}}</p>
</body>
</html>

Si queremos utilizar funciones personalizadas en plantillas, debemos registrar estas funciones en el FuncMap del paquete "html/template". Normalmente, almacenamos funciones y plantillas personalizadas en diferentes archivos y luego las cargamos durante la inicialización del programa.

Por supuesto, hay más de un método, se pueden utilizar ambos métodos anteriores y usted puede elegir según sus preferencias personales.

Al mismo tiempo, me gustaría agregar un complemento al segundo escenario y explicar otra implementación específica utilizada en este escenario.

Supongamos que tenemos un archivo llamado "funcs.go" en el proyecto, que define una función personalizada llamada "doble":

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
}

En el código anterior, registramos la función " doble " en el FuncMap del paquete " html/template " e inicializamos la plantilla usando la función " template.Must ". En el archivo de plantilla " template.html " podemos usar la función " doble " así :

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>My Template</title>
</head>
<body>
    <p>{
   
   { double . }}</p>
</body>
</html>

En la plantilla anterior, usamos el punto " . " para representar el objeto de datos actual y luego llamamos a la función personalizada a través de " doble ". Cuando llamamos a la función " renderTemplate ", el objeto de datos se pasa a la plantilla para renderizar y se genera el resultado.

Espero que esto pueda ayudarte y darle me gusta al blogger! !

Supongo que te gusta

Origin blog.csdn.net/A_LWIEUI_Learn/article/details/131198318
Recomendado
Clasificación