当前位置: 首页 > news >正文

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))
        
      1. 在模板中调用函数:
      • {{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 了&#xff0c;我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中&#xff0c;我们要提取的…...

本地Linux 部署 Dashy 并远程访问教程

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 转载自cpolar极点云文章&#xff1a;本地Linux 部署 Dashy 并远程访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你…...

6.2 口令破解攻击

数据参考&#xff1a;CISP官方 目录 口令安全问题口令破解攻击口令破解安全防护口令使用安全管理 一、口令安全问题 什么是口令 身份验证的机制&#xff0c;俗称 “密码"&#xff0c;对应英文单词为 password成本较低&#xff0c;得到广泛应用信息安全中的 “密码”…...

SSL账号申请及配置

摘自个人印象笔记https://app.yinxiang.com/fx/db244155-c858-4d8a-93a8-08071d168dc8ssl申请平台&#xff1a;https://blog.freessl.cn/ ajian51168qq.com … 操作说明&#xff1a;https://blog.freessl.cn/acme-quick-start/ nginx配置&#xff1a; upstream local_tomcat{s…...

JS代码混淆加密有什么用?

JS加密、JS混淆&#xff0c;有这些用&#xff1a; 1、前端JS代码&#xff0c;如果不加密&#xff0c;它人可以随便copy、任意修改。自己写的代码&#xff0c;可以轻易成为别人的成果。 对JS代码混淆加密&#xff0c;则可以防止这种他人随意白嫖的问题&#xff0c;代码是自己辛…...

Oracle的function執行DML操作

Oracle的function並不支持DML操作&#xff0c;但可以使用一段指令&#xff0c;讓這段pl/sql成為獨立的事務。 当使用 PRAGMA AUTONOMOUS_TRANSACTION 时&#xff0c;可以在一个过程或函数的独立代码块中执行数据库操作&#xff0c;而不受外部事务的影响。这意味着内部事务的提交…...

大语言模型:LLM的概念是个啥?

一、说明 大语言模型&#xff08;维基&#xff1a;LLM- large language model&#xff09;是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的&#xff0c;人工智能加速器能够处理大量文本数据&#xff0c;这些数据大部分是从互联网上抓取的。 [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许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成&#xff0c;同时提供了Python、Ruby、MATLAB等…...

基于颜色进行轮廓分割,基于opencv和python

1. 阈值调整&#xff0c;交互式的阈值调整&#xff0c;确定上限和下限&#xff1a; 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 组件&#xff0c;都提供了 /metrics 接口用来暴露监控数据&#xff0c;Kube-Proxy 也不例外。通过 ss 或者 netstat 命令可以看到 Kube-Proxy 监听的端口&#xff0c;一个是 10249&#xff0c;用来暴露监控指标&#xff0c;一个是 10256 &#xff0c;作为…...

Mysql之优化-主从复制

1、索引优化 &#xff08;1&#xff09;性能下降&#xff0c;执行、等待时间长&#xff1a;数据过多—》分库分表&#xff0c;关联太多&#xff0c;索引未使用&#xff0c;参数调优 &#xff08;2&#xff09;索引失效情况&#xff1a;索引列计算或函数等操作&#xff0c;索引…...

编程之道:构建优雅可维护代码的基石

编程世界犹如一座庞大的建筑群&#xff0c;而代码构建块则是这座建筑的基石。类比于建筑学中的基础构件&#xff0c;代码构建块是软件开发过程中不可或缺的元素。本文将深入探讨代码构建块的概念以及其在编写高质量代码方面的重要性。 什么是代码构建块&#xff1f; 在软件开发…...

十大经典排序算法

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

Linux6.37 Kubernetes 集群调度

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes 集群调度一、调度约束1.调度过程2.指定调度节点3.亲和性1&#xff09;节点亲和性2&#xff09;Pod 亲和性3&#xff09;键值运算关系 4.污点(Taint) 和 容忍(Tolerations)1&#xff09;污点(Taint)2&#xff09;容忍(Toler…...

记录一次前端input中的值为什么在后端取不到值

前端源码&#xff1a; <input type"text" name"user" placeholder"请输入你的名字" class"layui-input" value"{{ username}}" size"50" disabled"true"> 后端源码&#xff1a; send_name req…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...