Go语言模板语法

这篇具有很好参考价值的文章主要介绍了Go语言模板语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go语言模板语法

连接前后端的符号: {{}}

  • 模板语法都包含在{{}}之中,其中{{.}}中的.表示当前对象.在传入一个结构体对象时,可以根据"."来访问结构体的对应字段.如果是复合类型数据,则可以通过{{.FiledName}}来访问它的字段,FiledName是指对应go代码中的结构体变量名

  • 伪代码例子:

    //在html文档中
    <body>
    	<p>Hello {{.Name}}</p>
    	<p>Gender {{.Gemder}}</p>	
    	<p>Age {{.Age}}</p>
    </body>
    
    //在Go代码中
    type UserInfo struct{
        Name string
        Gender string
        Age 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 main
        
        import (
        	"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}}
      
      • 和上面的基本一致
    • 后端代码文章来源地址https://www.toymoban.com/news/detail-639173.html

      package main
      
      import (
      	"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语言模板语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang:Go语言结构

    在我们开始学习 Go 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构。 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 表达式 注释 接下来让我们来看下简单的代码,该代码输出了\\\"Hello World!\\\": 让我们来看下以上程序的各个部分: 第一

    2024年02月10日
    浏览(50)
  • golang实现webgis后端开发

    目录 前言 二、实现步骤 1.postgis数据库和model的绑定 2.将pg库中的要素转换为geojson (1)几何定义 (2)将wkb解析为几何类型 (3)定义geojson类型 (4)数据转换 (5)数据返回  2.前端传入的geojson储存到数据库 3、其他功能实现 总结         停更了接近一个月都在研究一门新语言gola

    2024年02月08日
    浏览(40)
  • 【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(55)
  • 【GoLang】MAC安装Go语言环境

    小试牛刀 首先安装VScode软件 或者pycharm mac安装brew软件  brew install go 报了一个错误 不提供这个支持  重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env  可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc,  

    2024年02月15日
    浏览(45)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(68)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(43)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(47)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(45)
  • GO语言语法结构

    包声明 引入包 函数 变量 语句  表达式 注释 如这段代码块根据上面的语法结构进行逐行解释 第一行的 package main 是定义一个包名,必须在源文件中非注释的第一行指明这个文件属于哪个包,如 package main ,可以代表一个独立执行的程序,每个GO应用程序都包含一个名为 main

    2024年02月13日
    浏览(39)
  • 【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 Go 语言从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关

    2023年04月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包