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

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

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

相关文章

sql-libs靶场-----0x00、环境准备

文章目录 一、PhPstudy下载、安装二、Sqli-libs下载、搭建三、启用Sqli-libs phpstudy地址&#xff1a;https://www.xp.cn/ sqli-libs地址&#xff1a;https://github.com/Audi-1/sqli-labs 一、PhPstudy下载、安装 1、下载–解压–安装&#xff0c;安装完成如下图 2、更换php…

【学习笔记】[AGC021F] Trinity

有点难&#x1f605; 考虑加入每一列&#xff0c;发现我们只关心当前还未确定的行的数目 有点难算&#x1f605; 设 d p i , j dp_{i,j} dpi,j​表示有 i i i列&#xff0c;其中 j j j行未确定的方案数。钦定每一列至少有一个黑色格子。 d p i , j j ( j 1 ) 2 d p i − 1…

IGV.js 的完全本地化运行探索

问题及解决方法 IGV.js 完全本地化是为了合规&#xff0c;不使用外网的情况下查看基因组。不联网需要下载 genomes.json 文件及其中的内容之外&#xff0c;还需要修改 igv.js本身&#xff0c;防止5s超时后才显示网页内容。修改的关键词是: genomes.json&#xff0c;改为本地的…

Leetcode-每日一题【剑指 Offer 13. 机器人的运动范围】

题目 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&#xff0c;也不能进入行坐标和列坐标的数位之和大于k的格子。例…

一个简单实用的线程池及线程池组的实现!

1.线程池简介 线程池&#xff0c;顾名思义&#xff0c;就是一个“池子”里面放有多个线程。为什么要使用线程池呢&#xff1f;当我们编写的代码需要并发异步处理很多任务时候&#xff0c;一般的处理办法是一个任务开启一个线程去处理&#xff0c;处理结束后释放线程。可是这样…

【QT】窗口通过dragEnterEvent和dropEvent拖拽导入文件

【QT】窗口通过dragEnterEvent和dropEvent拖拽导入文件 界面允许接受拖拽 在界面的构造函数中设置接受拖拽放置文件 setAcceptDrops(true); 拖拽进入、放下事件 dragEnterEvent函数对拖动的文件进行过滤&#xff0c;如果不符合过滤条件按将无法拖拽进入窗口 dropEvent函数…

支付总架构解析

一、支付全局分层 一笔支付以用户为起点&#xff0c;经过众多支付参与者之后&#xff0c;到达央行的清算账户&#xff0c;完成最终的资金清算。那么我们研究支付宏观&#xff0c;可以站在央行清算账户位置&#xff0c;俯视整个支付金字塔&#xff0c;如图1所示&#xff1a; 图…

[保研/考研机试] KY135 又一版 A+B 浙江大学复试上机题 C++实现

题目链接&#xff1a; KY135 又一版 AB https://www.nowcoder.com/share/jump/437195121691736185698 描述 输入两个不超过整型定义的非负10进制整数A和B(<231-1)&#xff0c;输出AB的m (1 < m <10)进制数。 输入描述&#xff1a; 输入格式&#xff1a;测试输入包…

小米200万LOGO设计的前端实现技术详解

引言 小米是一家知名的科技公司&#xff0c;拥有众多粉丝。其标志性的LOGO是小米200万像素的文字LOGO&#xff0c;给人留下了深刻的印象。本文将详细介绍小米200万LOGO的前端设计实现技术&#xff0c;包括HTML、CSS和JavaScript的使用&#xff0c;以及展示最多的代码示例。 设…

mysql使用redis+canal实现缓存一致性

一、开启binlog日志 1.首先查看是否开启了binlog show variables like %log_bin%; 如果是OFF说明位开启 2、开启binlog日志&#xff0c;并重启mysql服务 右键我的电脑——管理——服务——MYSQL——属性 这里是my.ini地址 在[mysqld]底下添加 log-bin mysqlbinlog binlog-f…

c#设计模式-创建型模式 之 工厂模式

前言&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;是一种常用的对象创建型设计模式。该模式的主要思想是提供一个创建对象的接口&#xff08;也可以是抽象类、静态方法等&#xff09;&#xff0c;将实际创建对象的工作推迟到子类中进行。这样一来&#xff0c…

【计算机视觉|生成对抗】带条件的对抗网络进行图像到图像的转换

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 链接&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks | IEEE Conference Publicati…

Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

今日目标 掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 1 注解开发依赖注入(DI)【重点】 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用Autowired注解开启自动装配模式&#xff08;按类型&#xff09; Service public class StudentS…

HTTP 协议的基本格式和 fiddler 的用法

目录 一. HTTP 协议 1. HTTP协议是什么 2. HTTP协议的基本格式 HTTP请求 首行 GET和POST方法&#xff1a; 其他方法 经典面试题&#xff1a; URL Header(请求报头)部分 空行 ​HTTP响应 状态码总结: 二、Fiddler的用法 1.Fidder的安装 2.Fidder的使用 一. HTTP 协议 1. H…

解决macOS执行fastboot找不到设备的问题

背景 最近准备给我的备用机Redmi Note 11 5G刷个类原生的三方ROM&#xff0c;MIUI实在是用腻了。搜罗了一番&#xff0c;在XDA上找到了一个基于Pixel Experience开发的ROM&#xff1a;PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal)&#xf…

TMC Self-Managed 提升跨多云环境安全性

作为云原生技术栈的关键技术之一&#xff0c;Kubernetes 被企业用户广泛试用并开始支撑实际业务应用运行&#xff0c;实现技术先进性带来的生产力提升。但与此同时&#xff0c;随着 Kubernetes 技术的不断广泛与深化使用&#xff0c;企业用户也开始面临诸多技术上的挑战&#x…

嵌入式:ARM Day1

1. 思维导图 2.作业一 3.作业2

Android T 窗口层级其二 —— 层级结构树的构建(更新中)

如何通过dump中的内容找到对应的代码&#xff1f; 我们dump窗口层级发现会有很多信息&#xff0c;adb shell dumpsys activity containers 这里我们以其中的DefaultTaskDisplayArea为例 在源码的framework目录下查找该字符串&#xff0c;找到对应的代码就可以通过打印堆栈或者…

日常BUG —— Java判空注解

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一. 问题描述 问题一&#xff1a; 在使用Java自带的注解NotNull、NotEmpty、NotBlank时报错&#xff0c;…

CentOS8安装Git

错误1. 执行yum命令报错 【错误&#xff1a;Invalid configuration value: failovermethodpriority in /etc/yum.repos.d/CentOS-epel.repo; 配置&#xff1a;ID 为 "failovermethod" 的 OptionBinding 不存在】 1.cd /etc/yum.repos.d 2.vim CentOS-epel.repo //…