Go语言template模板语法
Go语言模板语法
文章目录
- <center> Go语言模板语法
- 连接前后端的符号: `{{}}`
- 注释
- 管道(pipeline)
- 变量
- 条件判断
- range 关键字
- with 关键字
- 比较函数
- 自定义函数
- 嵌套模板
- 模板继承
连接前后端的符号: {{}}
-
模板语法都包含在
{{}}
之中,其中{{.}}
中的.
表示当前对象.在传入一个结构体对象时,可以根据"."
来访问结构体的对应字段.如果是复合类型数据,则可以通过{{.FiledName}}
来访问它的字段,FiledName
是指对应go代码中的结构体变量名 -
伪代码例子:
//在html文档中 <body><p>Hello {{.Name}}</p><p>Gender {{.Gemder}}</p> <p>Age {{.Age}}</p> </body>//在Go代码中 type UserInfo struct{Name stringGender stringAge int } user := &UserInfo{Name:"李四",Gender: "未知",Age: 24, }
-
这样后端数据就传输到前端显示了
注释
- 语法:
{{/*注释内容*/}}
- 作用: 和其他语言的注释一致,目的是提升代码的可阅读性
- 注意: 可以进行多行注释,但是不可以嵌套注释,并且必须紧贴分界符始止
管道(pipeline)
- 介绍: 管道是指产生数据的操作,比如"{{.}}" , "{{.Name}}“等,Go语言模板语法中支持使用管道符号”|"链接多个指令,用法和UNIX下的管道类似,所以说管道就像一种概念,知道就行了
变量
- 介绍: 在Action里可以初始化一个变量来捕获管道的执行结果
- Action: 在Web开发中,Action通常指代处理HTTP请求的处理程序或函数。当用户在网页上执行某个操作(例如点击按钮、提交表单)时,相应的Action会被调用来处理请求并执行相应的逻辑操作。
- 语法:
$variable := pipeline
- 特点: 声明变量的Action不会产生任何输出,大概意思是仅仅声明该变量而没有对其进行赋值或使用时,程序的输出不会显示该变量的值或其他信息。只有在对变量进行赋值并在程序中使用时,才能在输出中看到相关的内容。
条件判断
- 语法:
{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
range 关键字
- 在Go中使用range关键字,pipeline的值必须是数组,切片,字典或者通道.
- 语法:
{{range pipeline}} T1 {{end}}
{{range pipeline}} T1 {{else}} T0 {{end}}
with 关键字
- with关键字和if关键字有点类似,"{{with}}"操作仅在传递的管道不为空时有条件地执行其主体
- 语法:
{{with pipeline}} T1 {{end}}
{{with pipeline}} T1 {{else}} T0 {{end}}
比较函数
符号 | 作用 |
---|---|
eq | == |
ne | != |
lt | < |
le | <= |
gt | > |
ge | >= |
- 特点: 只有
eq
符号可以接收多个参数,它会将第一个参数和其余参数一次比较 - 例子:
{{eq arg1 arg2 arg3}} ==> arg1== arg2||arg1 == arg3
自定义函数
-
在嵌套模板中存在预定义函数(官方已经定义好的)和自定义函数(自己定义的),自定义函数使得模板更加灵活.
-
自定义函数通过调用
Funcs()
方法实现Funcs()
方法定义:func (t *Template) Funcs(funcMap FuncMap) *Template
FuncMapd
定义:type FuncMap map[string]interface{}
-
定义步骤:
-
1.先到后端代码中定义一个函数: (匿名函数为例)
-
hello := func() (string){return "Hello!" }
-
-
2.调用
Funcs()
方法-
注意: 调用
Funcs()
方法,需要在解析模板前调用,也就是在Parse()
方法前 -
bytes,err := ioutil.ReadFile("文件名/文件路径") templl,err := template.New("为模板命名(尽量和文件名字一致)").Funcs(template.FuncMap{"hello":hello}).Parse(string(bytes))
-
-
- 在模板中调用函数:
{{hello}}
- 这里的
hello
是指定FuncMap
中的key
,也就是上面的"hello"
-
嵌套模板
-
介绍: 嵌套模板也就是,在一个html文件中使用多个模板,被嵌套的模板可以是一个单独的
html
文件,还可以利用define
关键字在该模板下定义一个模板define
语法: {{define “name”}} T(内容) {{end}}
-
通过
template
关键字来执行模板- 语法:
{{template "name"}}
{{template "name" pipeline}}
- 语法:
-
例子:(模板代码)
Demo.html
-
<html><body><h1>{{template "title.html"}}</h1><div>{{template "content.html"}}</div></body> </html> {{/*define 的定义写在html标签之下*/}} {{define "content.html"}}<li>小明</li><li>小红</li> {{end}}
-
title.html
文件定义-
<ul><il>你好</il> </ul>
-
-
-
后端代码(主要):
-
tmpl,err :=template.ParseFiles("Demo.html路径","title.html路径")
-
在解析代码的时候,需要将包含其他模板的文件写在第一位,其余的可随意顺序
-
-
相关类似代码:
-
hello.html文件
-
<p>大家好,我是小黑子</p>
-
-
Sever.html文件
-
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>嵌套模板</title> </head> <body>{{/*自定义函数加模板嵌套*/}}<h1>{{Hello}}</h1><hr><h2>{{template "hello.html"}}</h2><p>{{.}}真帅!</p><hr>{{template "come.html"}} </body> </html> {{define "come.html"}} <ul><li>唱</li><li>跳</li><li>rap</li><li>篮球</li> </ul> {{end}}
-
-
后端代码:
-
package mainimport ("html/template""log""net/http" )func main() {http.HandleFunc("/", hello)http.ListenAndServe(":9000", nil) }func hello(w http.ResponseWriter, r *http.Request) {//定义模板//解析模板,自定义函数Hello := func() string {return "--- 欢迎来到我的舞台 ---"}tmpl, err := template.New("Sever.html").Funcs(template.FuncMap{"Hello": Hello}).ParseFiles("src\\使用html和template包\\Go语言模板语法\\嵌套模板\\Sever.html","src\\使用html和template包\\Go语言模板语法\\嵌套模板\\hello.html")if err != nil {log.Println("解析模板失败!")return}name := "贤哥"//渲染模板err = tmpl.Execute(w, name)if err != nil {log.Println("渲染模板失败!:", err)} }
-
-
这里包含了 对自定义函数,嵌套模板,以及传值的使用
-
模板继承
-
介绍: 模板继承是指对各种类似的固定板块的复用,例如说很多时候我们的开发网站的时候,其实不同的网页很多的地方都是类似的,所以说利用模板继承可以复用模板,减少工作量,代码也更加简洁
-
关键字
block
- 语法:
{{block "name" pipeline}} T {{end}}
- 语法:
-
需要继承的模板,需要先继承根模板,然后再利用define关键字定义内容
-
例子
-
base.tmp
文件<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>模板继承</title> </head> <style>*{background-color:white;} </style> <body> <h1 style="color:red">模板继承</h1> <hr> <h2 style="color:blue">变化的内容:</h2> <div>{{block "context" .}}<p>会发生变化的地方</p><div><a href="http://localhost:9000/index">Index页面</a><br><a href="http://localhost:9000/home">Home页面</a></div>{{end}}</div> </body> </html>
- 其中涉及一点点的
css
内容,不影响阅读
- 其中涉及一点点的
-
index.tmpl
文件{{/*继承根模板*/}} {{template "base.tmpl" .}} {{/*定义块模板*/}} {{define "context"}} <h2>Index页面</h2> <p>Hello,{{.}}</p> <a href="http://localhost:9000">Base页面</a> {{end}}
- 先是继承然后定义内容,其中
{{template "base.tmpl" .}}
的" . “指传入的值,而<p>Hello,{{.}}</p>
的” . "接收该值 - 还有这里define后面的文件名,一定要与block时定义的名字一致
- 先是继承然后定义内容,其中
-
home.tmpl
文件{{/*继承根模板*/}} {{template "base.tmpl" .}} {{/*定义块模板*/}} {{define "context"}}<h2>Home页面</h2><p>Hello,{{.}}</p><a href="http://localhost:9000">Base页面</a> {{end}}
- 和上面的基本一致
-
后端代码
package mainimport ("html/template""log""net/http" )func main() {http.HandleFunc("/", base)http.HandleFunc("/index", index)http.HandleFunc("/home", home)err := http.ListenAndServe(":9000", nil)if err != nil {log.Println(err)return} }func base(w http.ResponseWriter, r *http.Request) {//定义模板//解析模板t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go语言模板语法\\模板继承\\base.tmpl")if err != nil {log.Println("解析失败:", err)return}//渲染模板err = t.Execute(w, nil)if err != nil {log.Println("渲染失败:", err)return} }func index(w http.ResponseWriter, r *http.Request) {//定义模板//解析模板(涉及嵌套模板)t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go语言模板语法\\模板继承\\base.tmpl","src\\使用html和template包\\Go语言模板语法\\模板继承\\index.tmpl")if err != nil {log.Println("解析失败:", err)return}name := "贤哥!"//渲染模板err = t.ExecuteTemplate(w, "index.tmpl", name)if err != nil {log.Println("渲染失败:", err)return} } func home(w http.ResponseWriter, r *http.Request) {//定义模板//解析模板t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go语言模板语法\\模板继承\\base.tmpl","src\\使用html和template包\\Go语言模板语法\\模板继承\\home.tmpl")if err != nil {log.Println("解析失败:", err)return}name := "振哥!"//渲染模板err = t.ExecuteTemplate(w, "home.tmpl", name)if err != nil {log.Println("渲染失败:", err)return} }
-
相关文章:
Go语言template模板语法
Go语言模板语法 文章目录 <center> Go语言模板语法连接前后端的符号: {{}}注释管道(pipeline)变量条件判断range 关键字with 关键字比较函数自定义函数嵌套模板模板继承 连接前后端的符号: {{}} 模板语法都包含在{{}}之中,其中{{.}}中的.表示当前对象.在传入一个结构体对…...

Python-OpenCV中的图像处理-物体跟踪
Python-OpenCV中的图像处理-物体跟踪 物体跟踪 物体跟踪 现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中,我们要提取的…...
本地Linux 部署 Dashy 并远程访问教程
文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 转载自cpolar极点云文章:本地Linux 部署 Dashy 并远程访问 简介 Dashy 是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你…...

6.2 口令破解攻击
数据参考:CISP官方 目录 口令安全问题口令破解攻击口令破解安全防护口令使用安全管理 一、口令安全问题 什么是口令 身份验证的机制,俗称 “密码",对应英文单词为 password成本较低,得到广泛应用信息安全中的 “密码”…...
SSL账号申请及配置
摘自个人印象笔记https://app.yinxiang.com/fx/db244155-c858-4d8a-93a8-08071d168dc8ssl申请平台:https://blog.freessl.cn/ ajian51168qq.com … 操作说明:https://blog.freessl.cn/acme-quick-start/ nginx配置: upstream local_tomcat{s…...

JS代码混淆加密有什么用?
JS加密、JS混淆,有这些用: 1、前端JS代码,如果不加密,它人可以随便copy、任意修改。自己写的代码,可以轻易成为别人的成果。 对JS代码混淆加密,则可以防止这种他人随意白嫖的问题,代码是自己辛…...
Oracle的function執行DML操作
Oracle的function並不支持DML操作,但可以使用一段指令,讓這段pl/sql成為獨立的事務。 当使用 PRAGMA AUTONOMOUS_TRANSACTION 时,可以在一个过程或函数的独立代码块中执行数据库操作,而不受外部事务的影响。这意味着内部事务的提交…...

大语言模型:LLM的概念是个啥?
一、说明 大语言模型(维基:LLM- large language model)是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的,人工智能加速器能够处理大量文本数据,这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…...

21 | 朝阳医院数据分析
朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,通过对朝阳区医院的药品销售数据的分析,了解朝阳医院的患者的月均消费次数,月均消费金额、客单价以及消费趋势、需求量前几位的药品等。 import numpy as np from pandas import Series,DataFrame impo…...

二十二、责任链模式
目录 1、使用demo演示责任链模式2、传统方案解决oa系统审批3、传统方案解决oa系统审批存在的问题4、职责链模式基本介绍5、职责链模式原理类图6、职责链模式解决oa系统采购审批7、职责链模式的注意事项和细节8、职责链模式的实际使用场景举例 1、使用demo演示责任链模式 学校o…...
opencv,opengl,osg,vulkan,webgL,opencL,cuda,osg,vtk,ogre的区别
OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等…...
基于颜色进行轮廓分割,基于opencv和python
1. 阈值调整,交互式的阈值调整,确定上限和下限: import cv2 as cv import numpy as npdef Tcallback(event):H cv.getTrackbarPos(H, show_pic)S cv.getTrackbarPos(S, show_pic)V cv.getTrackbarPos(V, show_pic)H0 cv.getTrackbarPos(…...
TCP重连 - 笔记
1 C++ TCP/IP 关于tcp断线重连的问题 C++ TCP/IP 关于tcp断线重连的问题_c++ 断线重连_Bug&猿柒。的博客-CSDN博客 2 C++基础--完善Socket C/S ,实现客户端,服务器端断开重连 https://www.cnblogs.com/kingdom_0/articles/2571727.html 3 C++实现Tcp通信(考虑客户…...

Qt画波浪球(小费力)
画流动波浪 #ifndef WIDGET3_H #define WIDGET3_H#include <QWidget> #include <QtMath> class widget3 : public QWidget {Q_OBJECT public:explicit widget3(QWidget *parent nullptr);void set_value(int v){valuev;}int get_value(){return value;} protecte…...

监控Kubernetes Node组件的关键指标
所有的 Kubernetes 组件,都提供了 /metrics 接口用来暴露监控数据,Kube-Proxy 也不例外。通过 ss 或者 netstat 命令可以看到 Kube-Proxy 监听的端口,一个是 10249,用来暴露监控指标,一个是 10256 ,作为…...
Mysql之优化-主从复制
1、索引优化 (1)性能下降,执行、等待时间长:数据过多—》分库分表,关联太多,索引未使用,参数调优 (2)索引失效情况:索引列计算或函数等操作,索引…...
编程之道:构建优雅可维护代码的基石
编程世界犹如一座庞大的建筑群,而代码构建块则是这座建筑的基石。类比于建筑学中的基础构件,代码构建块是软件开发过程中不可或缺的元素。本文将深入探讨代码构建块的概念以及其在编写高质量代码方面的重要性。 什么是代码构建块? 在软件开发…...

十大经典排序算法
目录 前言 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 十大排序之间的比较 总结 前言 学了数据结构之后一直没有进行文字性的总结,现在趁着还有点时间把相关排序的思路和代码实现来写一下。概念的话网上…...

Linux6.37 Kubernetes 集群调度
文章目录 计算机系统5G云计算第三章 LINUX Kubernetes 集群调度一、调度约束1.调度过程2.指定调度节点3.亲和性1)节点亲和性2)Pod 亲和性3)键值运算关系 4.污点(Taint) 和 容忍(Tolerations)1)污点(Taint)2)容忍(Toler…...
记录一次前端input中的值为什么在后端取不到值
前端源码: <input type"text" name"user" placeholder"请输入你的名字" class"layui-input" value"{{ username}}" size"50" disabled"true"> 后端源码: send_name req…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...