go模版引擎的使用~~

go模板语句

以下是一些go语言模板引擎的一些简单知识和使用

基础语法

重要!!!:

模板在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页, golang也支持模板渲染。
【1】模板内内嵌的语法支持,全部需要加 {{}} 来标记。

【2】在模板文件内, . 代表了当前位置的上下文:

  1. (1)在非循环体内,. 就代表了后端传过来的上下文

  2. (2)在循环体中,. 就代表了循环的上下文,访问当前迭代的元素,意思是切片的话,循环里就是指数组的单个元素

    【3】在模板文件内, $.代表了模板根级的上下文

    【4】在模板文件内,$有两种用法:第一种,代表了当前迭代的索引值

    例子:

    {{ range $index, $element := .Items }}Index: {{ $index }}, Element: {{ $element }}
    {{ end }}
    

    第二种:在模板中定义和赋值变量:这个之后会讲到

    {{ $variable := .SomeValue }}
    后续的模板代码中使用 $variable来表示.SomeValue
    

简单示例

前端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Gin模板引擎示例</title>
</head>
<body><h1>Hello, {{.Name}}!</h1>
</body>
</html>

后端

{{.Name}}实际就是获取了map中name字段的值package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 加载模板文件r.LoadHTMLGlob("templates/*")// 定义路由r.GET("/hello", func(c *gin.Context) {// 渲染模板,并传递数据c.HTML(200, "index.html", gin.H{"Name": "Gin User",//注意!:gin.H{"title": "Hello Gin"}实际是map[string]interface{},通过用{{.Name}}实际就是获取了map中name字段的值,.就是上下文中gin.H传过来的数据;})})// 启动应用r.Run(":8080")
}

对符号的支持

  1. 1. 字符串:{{ “abc啦啦啦”}}                                       输出 abc啦啦啦
    2. 原始字符串:用转义字符{ {`啦啦啦` } }    { { `a` } }    不会转义   输出 啦啦啦a
    3. 字节类型:{ { 'a' } } ---> 97  会转义                          输出 97
    4. 打印:打印 :字符串: { { print "abc李总辉" } }                        输出:abc李总辉nil类型:{ { print nil } }                                    输出:<nil>
    

变量的定义和使用

演示:

讲到了$的第二个作用,变量的定义

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>变量的定义:{{$name := "马士兵888"}}变量的使用:{{$name}}
</body>
</html>
//最后会输出:   李总辉888

模板语法:

if语句:

支持最简单的bool类型字符串类型的判断:

当.condition为bool类型的时候,则为true表示执行,当.condition为string类型的时候,则非空表示执行。

{{if .Condition}}{{/* 如果条件为真,执行此处的内容 */}}
{{else}}{{/* 如果条件为假,执行此处的内容 */}}
{{end}}
循环语句:

刚刚最开始也演示过

{{range .Items}}{{.}}   {{/* 输出当前迭代的元素 */}}
{{end}}
内置的模板函数:

(用到的时候再去看吧)

not 非
and 与
or 或
eq 等于
ne 不等于
lt 小于 (less than)
le 小于等于
gt 大于
ge 大于等于
with的使用

其实就是提供的一个简便的写法:,用于创建一个新的局部作用域

使用起来很简单

{{with .Value}}{{/* 在这个作用域内,可以直接访问 .Value ,就是说把.Value变成了.来操作*/}}
{{end}}

比如:

原写法:
Name: {{.Person.Name}}
Age: {{.Person.Age}}使用with
{{with .Person}}Name: {{.Name}}Age: {{.Age}}
{{end}}

模板函数

【1】print     打印字符串
【2】printf    按照格式化的字符串输出
格式:参照:Go中:fmt.Sprintf
PS : 具体的格式参照GO中格式:https://studygolang.com/pkgdoc
【3】len  返回对应类型的长度(map, slice, array, string, chan)
【4】管道传递符:   |  
函数中使用管道传递过来的数值 
【5】括号提高优先级别:()`

进阶示例:

后端

func Hello1(context *gin.Context){//定义数据:age := 19arr := []int{33,66,99}//将age 和arr放入map中:map_data := map[string]interface{}{"age" : age,"arr" : arr,}//获取路径中的参数值:context.HTML(200,"demo01/hello.html",map_data)将定义的数据(age和arr)传递给HTML模板,然后使用Gin框架将渲染后的HTML作为HTTP响应发送给客户端。在hello.html模板中使用age和arr的值来动态生成页面内容。

前端

<body>{{.age}
{{range .arr}}{{.}}{{$.age}}
{{end}}
<br>
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
{{/*$i,$v  从 后端传过来的map_data这个上下文中获取数据 */}}
{{range $i,$v := .arr}}{{$i}}{{$v}}
{{end}}</body>

后端

<body>{{/*获取后端传过来的map_data中的内容:*/}}{{/* . 当前的上下文,后端传过来的map_data这个上下文*/}}{{.age}}{{/*. 当前的上下文,后端传过来的map_data这个上下文*/}}{{range .arr}}{{/*. 上下文指的就是.arr这个上下文,指的就是遍历的每一个元素*/}}{{.}}{{/*在循环内部想获取根级上下文中的age的话,就需要使用$.来获取 (map_data这个上下文)*/}}{{$.age}}{{end}}<br>、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、{{/*$i,$v  从 后端传过来的map_data这个上下文中获取数据 */}}{{range $i,$v := .arr}}{{$i}}{{$v}}{{end}}
</body>

模版嵌套

为什么会有嵌套呢?他的作用其实还是很大的,主要用于在基础模版上充当更改部分模板的功能;

示例:

后端

// main.go
package mainimport ("html/template""net/http""github.com/gin-gonic/gin"
)var templates *template.Templatefunc init() {// 解析所有模板文件templates = template.Must(template.ParseGlob("templates/*.html"))
}func main() {router := gin.Default()// 基础路由router.GET("/", func(c *gin.Context) {// 渲染 index.html,不需要嵌套其他模板renderTemplate(c, "index.html", gin.H{"Title": "Home", "Content": "Welcome to the home page"})})// 带有模板嵌套的路由router.GET("/about", func(c *gin.Context) {// 渲染 base.html,并在 content 块中嵌套 about.htmlrenderTemplate(c, "base.html", gin.H{"Title": "About", "Content": "about.html"})})router.Run(":8080")
}func renderTemplate(c *gin.Context, tmpl string, data gin.H) {// 执行模板渲染err := templates.ExecuteTemplate(c.Writer, tmpl, data)if err != nil {// 处理错误c.AbortWithError(http.StatusInternalServerError, err)}
}// 路由渲染的是 "index.html" 模板,而 /about 路由渲染的是 "base.html" 模板,并在 content 块中嵌套了 "about.html" 模板。

前端:三个文件

------------templates/base.html-----------
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{.Title}}</title>
</head>
<body><div id="content">{{ template "content" . }}</div>
</body>
</html>
-------------- templates/index.html--------------
{{ define "content" }}<h1>{{.Title}}</h1><p>{{.Content}}</p>
{{ end }}
---------templates/about.html------------
{{ define "content" }}<h1>{{.Title}}</h1><p>This is the content of the about page.</p>
{{ end }}

模板文件之间通过 {{ template "content" . }} 来实现了模板嵌套。

基础模板 “base.html” 定义了一个 content 块,子模板通过定义同名的块来覆盖或扩展基础模板中的内容。

啥意思呢?其实就是**base.html 充当了一个基础布局模板,而 index.htmlabout.html 分别充当了具体页面的内容模板。通过模板嵌套,可以轻松地在不同页面之间共享基础布局,提高模板的复用性。**

模版继承

模板继承是一种模板组织方式,通过它,你可以创建一个包含通用结构和样式的基础模板,并在此基础上创建具体内容的子模板。子模板可以覆盖或扩展基础模板中的块,从而实现灵活的页面结构和外观定制。

在模板继承中,通常有两个主要角色:

  1. 基础模板(父模板): 包含页面的整体结构、布局和通用元素。基础模板中定义了一些块(block),这些块表示可以被子模板覆盖或扩展的区域。
  2. 子模板: 继承基础模板,并提供具体的内容。子模板通过定义和填充基础模板中的块来定制页面的特定部分。

案例:

----------base.html----------
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}Default Title{% endblock %}</title>
</head>
<body><div id="content">{% block content %}{% endblock %}</div>
</body>
</html>
-------------child.html-------------
{% extends "base.html" %}{% block title %}Child Title{% endblock %}{% block content %}<h1>Welcome to the child page</h1><p>This is the content of the child page.</p>
{% endblock %}
子模板 `child.html` 使用了 `{% extends "base.html" %}` 来声明继承自 `base.html`,然后通过 `{% block title %}...{% endblock %}` 和 `{% block content %}...{% endblock %}` 来定义或覆盖基础模板中的块。

后端:

package mainimport ("html/template""net/http""github.com/gin-gonic/gin"
)var templates *template.Templatefunc init() {// 解析所有模板文件templates = template.Must(template.ParseGlob("templates/*.html"))
}func main() {// 创建Gin引擎router := gin.Default()// 子模板路由router.GET("/child", func(c *gin.Context) {// 渲染 child.htmlrenderTemplate(c, "child.html", nil)})// 启动服务器router.Run(":8080")
}func renderTemplate(c *gin.Context, tmpl string, data interface{}) {// 执行模板渲染err := templates.ExecuteTemplate(c.Writer, tmpl, data)if err != nil {// 处理错误c.AbortWithError(http.StatusInternalServerError, err)}
}

原文链自:https://lz.chatallshop.top/?p=156

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/170316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上手 Promethus - 开源监控、报警工具包

名词解释 Promethus 是什么 开源的【系统监控和警报】工具包 专注于&#xff1a; 1&#xff09;可靠的实时监控 2&#xff09;收集时间序列数据 3&#xff09;提供强大的查询语言&#xff08;PromQL&#xff09;&#xff0c;用于分析这些数据 功能&#xff1a; 1&#xff0…

Java Web——XML

1. XML概述 XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。XML是一种用于存储和传输数据的语言&#xff0c;它使用标签来标记数据&#xff0c;以便于计算机处理和我们人来阅读。 “可扩展”三个字表明XML可以根据需要进行扩展和定制。这意味…

【LeetCode】485. 最大连续1的个数

485. 最大连续1的个数 难度&#xff1a;简单 题目 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最…

ubuntu+Teslav100 环境配置

系统基本信息 nvidia-smi’ nvidia-smi 470.182.03 driver version:470.182.03 cuda version: 11.4 产看系统体系结构 uname -aUTC 2023 x86_64 x86_64 x86_64 GNU/Linux 下载miniconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CM&OA https://mi…

如何解决React子组件中的逻辑很多影响父组件回显速度的问题

前言 更新状态导致重新渲染时&#xff0c;由于子组件中的逻辑很多&#xff0c;影响到父组件的回显速度。 React18之前&#xff0c;由于渲染是同步的&#xff0c;一旦开始渲染&#xff0c;就不可被中断&#xff0c;所谓的同步&#xff0c;就是指如果react的某个组件执行时间长…

MyBatisPlus入门介绍

目录 一、MyBatisPlus介绍 润物无声 效率至上 丰富功能 二、Spring集成MyBatisPlus 三、SpringBoot集成MyBatisPlus 一、MyBatisPlus介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c…

Kafka系列 - Kafka一篇入门

Kafka是一个分布式流式处理平台。很多分布式处理系统&#xff0c;例如Spark&#xff0c;Flink等都支持与Kafka集成。 Kafka使用场景 消息系统&#xff1a;Kafka实现了消息顺序性保证和回溯消费。存储系统&#xff1a;Kafka把消息持久化到磁盘&#xff0c;相比于其他基于内存的…

如何处理git多分支

本篇文章主要处理以下两种多分支问题 如何将自己在本地的修改上传到一个新的Git分支&#xff08;比如用于测试&#xff0c;不合并进main分支&#xff09;&#xff1f;如何在一个新的本地仓库拉取一个项目的非main分支&#xff0c;并处理他们关联关系&#xff1f; 1. 将自己在…

java基于springboot公益帮学网站 新闻发布系统的设计与实现vue

以Java为开发平台&#xff0c;综合利用Java Web开发技术、数据库技术等&#xff0c;开发出公益帮学网站。用户使用版块&#xff1a;可以选择注册并登录&#xff0c;可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块&#xff1a;以管理员身份登录网站后台…

C# 读写FDX-B(ISO11784/85)动物标签源码

本示例使用的发卡器&#xff1a;EM4305 EM4469 ISO11784/85协议125K低频FXD-B动物标签读写发卡器-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using S…

rk3588配置uac功能,android13使能uac及adb的复合设备

最近&#xff0c;因新增需求需要在现有产品上增加UAC的功能&#xff0c;查阅并学习相关知识后&#xff0c;在rk3588 SOC硬件平台搭载android13系统平台上成功配置了uac及uac&adb的复合设备。基于开源共享精神希望给大家提供些参考。 1.技术可行性预研 &#xff08;1&#…

【一起来学kubernetes】7、k8s中的ingress详解

引言配置示例负载均衡的实现负载均衡策略实现模式实现方案Nginx类型Ingress实现Treafik类型Ingress实现HAProxy类型ingress实现Istio类型ingress实现APISIX类型ingress实现 更多 引言 Ingress是Kubernetes集群中的一种资源类型&#xff0c;用于实现用域名的方式访问Kubernetes…

人工智能-注意力机制之残差连接和层规范化

残差连接和层规范化 层规范化和批量规范化的目标相同&#xff0c;但层规范化是基于特征维度进行规范化。尽管批量规范化在计算机视觉中被广泛应用&#xff0c;但在自然语言处理任务中&#xff08;输入通常是变长序列&#xff09;批量规范化通常不如层规范化的效果好。 以下代…

自建私有化证书颁发机构(Certificate Authority,CA)实战之 《0x02 Nginx 配置 https双向认证》

自建CA实战之 《0x02 Nginx 配置 https双向认证》 上一章节我们已经实现了Nginx上配置https单向认证&#xff0c;主要场景为客户端验证服务端的身份&#xff0c;但是服务端不验证客户端的身份。 本章节我们将实现Nginx上配置https双向认证&#xff0c;主要场景为客户端验证服…

C++ 实现位图

引出 面试题&#xff1a;给出 40 亿个不重复的无符号整数&#xff0c;没有排过序。给定一个无符号整数&#xff0c;如何快速判断这个数是否在这 40 亿个无符号整数中。[ 腾讯面试题 ] 想法一&#xff1a;将 40 亿个数据存放到 set 里面&#xff0c;然后再查找指定的无符号整数。…

Python基础入门例程75-NP75 使用字典计数(字典)

最近的博文: Python基础入门例程74-NP74 字典新增(字典)-CSDN博客 Python基础入门例程73-NP73 查字典(字典)-CSDN博客 Python基础入门例程72-NP72 生成字典(字典)-CSDN博客 目录 最近的博文:

论文阅读——MCAN(cvpr2019)

补充一下MCAN-VQA&#xff1a; 对图片的处理&#xff1a;首先输入图片到Faster R-CNN&#xff0c;会先设定一个判断是否检测到物体的阈值&#xff0c;这样动态的生成m∈[10,100]个目标&#xff0c;然后从检测到的对应的区域通过平均池化提取特征。第i个物体特征表示为&#xff…

MUYUCMS v2.1:一款开源、轻量级的内容管理系统

MuYuCMS&#xff1a;一款基于Thinkphp开发的轻量级开源内容管理系统&#xff0c;为企业、个人站长提供快速建站解决方案。它具有以下的环境要求&#xff1a; 支持系统&#xff1a;Windows/Linux/Mac WEB服务器&#xff1a;Apache/Nginx/ISS PHP版本&#xff1a;php > 5.6 (…

3.3.4打开cpu初始化大门之cpumask

文章目录 作用初始化定义接口参考作用 初始化 // in kernel/cpu.c void __init boot_cpu_init(void) {int cpu = smp_processor_id();set_cpu_online(cpu, true);set_cpu_active(cpu, true);set_cpu_present(cpu, true);set_cpu_possible(cpu, true); ​ #ifdef CONFIG_SMP__…

发布鸿蒙的第一个java应用

1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;搞了半天才发现8&#xff…