首页 > 其他分享 >Go Template 常用疑难知识点

Go Template 常用疑难知识点

时间:2024-03-28 12:00:37浏览次数:26  
标签:知识点 调用 Template 作用域 int template Go 方法 模板

前段时间,在项目开发中经常和go语言的HTMLL template打交道,特意总结了几点我在使用中经常遇到不太明确的,比较纠结疑惑的知识点,巩固一下,也方便以后查找。

​ 至于关于go template的系统性的介绍说明,这是一篇我经常查看的文章,写的非常全面。

1、作用域访问

​ go template中最常打交道的就是点作用域,点"."代表当前作用域的当前对象,因此在通常情况下,”.“指的就是传给template的Execute方法的数据对象。这里针对是在在Gin环境中,数据对象就是传递给*gin.Context的HTML方法的第三个参数

dataContext := gin.H{"examID":exam_id, "examName": exam.Name, "questions": qtypeQuestionsMap}
c.HTML(200, "ffe/exams.tmpl", dataContext)

​ 对应与上面的template执行代码,在模板中的顶级作用域就是上面的dataContext对象,那么”{{ .questions}}”获得的就是dataContext["questions"]

​ 对于在range、with方法中,"."相应的变为当前迭代的项目或with的对象,此时如果要访问顶级作用域中的属性,就要用到"$"这个一直指向模板级顶级作用域的特殊符号了,注意是模板级的,在子模板中"$"并不能指向父模板的数据对象(当然可以传递过去)

{{ range $qtype,$qss:=.questions }}
    {{ $ind = inc $ind }}
		{{/*在range中访问顶级作用域中的对象qtypeMap并调用index方法,同时声明了$qts局部变量可以在后续代码中使用*/}}
    {{ $qts := index $.qtypeMap $qtype }} 		
		<div class="qtype" data-qtype="{{$qts.QtypeID}}">{{$qts.QtypeName}}</div>
{{ end }}

2、方法调用

GO template中调用实例方法很简单,和访问实例的字段属性一样,不要使用call函数,直接dot+方法名就行了,但是这里有几点要注意:

  1. 方法只能返回一个值,或者第二个返回值是Error类型

  2. Template执行时,调用方法的主体区分是否指针,不会自动装换,这点需要特别注意

  3. 方法有参数不需要括号,直接依次空格分割传递就行了,例如下面的ItemScore方法需要2个int参数

    {{ $qts.ItemScore 2 2}}
    
  4. 方法的连续调用,需要用管道符”|“来链接,比如下面的示例,需要调用”.q“的”QOHtmlTyped“方法,参数为” false“,然后在调用自定义模板方法”html“

    {{ .q.QOHtmlTyped false | html }}
    

3、自定义函数

funcMap:=template.FuncMap{
		"html": func(s string) template.HTML{
			return template.HTML(s)
		},
		"inc": func(n int)int{
			return n+1
		},
		"avg": func(total float64,  count float64)float64{
			return total/ count
		},
		"avgByInt": func(total float64,  count int)float64{
			return total/ float64(count)
		},
		"add": func(n int,an ...int)int{
			s:=n
			for _,a:=range an{
				s += a
			}
			return s
		},
	}

上面代码是我自定义的一些常用方法,虽然很简单,但是在模板中不能实现,只能通过自定义函数来实现。

对于Gin环境下,只需要调用 *gin.Engine的”SetFuncMap“方法就可以了。

由于我使用了第三方multitemplate库,需要调用multitemplate Render的方法

render := multitemplate.NewRenderer()
...
render.AddFromFilesFuncs(name,funcMap,files...)

标签:知识点,调用,Template,作用域,int,template,Go,方法,模板
From: https://www.cnblogs.com/dajianshi/p/18101294

相关文章

  • Django框架之python后端框架介绍
    一、网络框架及MVC、MTV模型1、网络框架网络框架(Webframework)是一种软件框架,用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具,以简化开发过程并提高开发效率。网络框架通常包括以下功能和特点:路由处理(Routing):网络框架定义了URL与处理程序......
  • mysql 主从复制 -- django发送钉钉通知
    mysql主从搭建#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是?-读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#原理MySQL服务器之间的主从同步是基于二进制日志机制(binlog),主服务器使用二进制日志来(bi......
  • 【附源码】django计算机毕业设计web的学生作业管理系统(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在当今信息化、数字化的教育环境中,学生作业管理已成为教学过程中不可或缺的一部分。传统的作业管理方式,如纸质作业本、电子邮件提交等,存在着效率低下、资源......
  • 【附源码】django计算机毕业设计病房管理系统设计与实现(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,病房管理是医院运营的重要组成部分。随着科技的不断进步和信息化水平的提高,传统的手工或半自动化的病房管理模式已经无法满足现代医疗服务......
  • gopher伪协议
    基础知识基本格式基本格式:URL:gopher://<host>:<port>/<gopher-path>web也需要加端口号80gophert协议默认端口为70gopheri请求不转发第一个字符get请求问号(?)需要转码为URL编码,也就是%3f回车换行要变为%0d%0a,但如果直接用工具转,可能只会有%0a在HTTP包的最后要加%0d%......
  • Centos7.9 部署mongodb高可用集群 3节点
    一、部署准备1.三台节点准备192.168.145.172192.168.145.173192.168.145.1742.官网地址:社区版传送门3.选择对应的版本并下载4.创建用于存放数据、日志文件和配置文件的文件夹mkdir-p/data/mongodbmkdir/var/log/mongodbmkdir/etc/mongodb5.解压安装包,配置环境......
  • 在Go语言中如何正确使用init函数
    1.概念        init函数是用于初始化应用程序状态的函数。既不接收参数也不返回结果,仅仅是一个func()类型的函数。当初始化包时,将对包中所有的常量和变量声明进行计算。然后执行init函数。下面是初始化main包的例子:packagemainimport"fmt"vara=func()int......
  • 抽象的艺术:Go 语言中的编程哲学
    抽象的艺术:Go语言中的编程哲学原创 TimLiu 爱发白日梦的后端 2024-03-2507:00 广东 1人听过 爱发白日梦的后端专注Go语言领域的发展,学习成为更牛逼的架构师,日常分享Go语言、架构、软件工具的使用。179篇原创内容公众号点击上方“名片”,关......
  • salesforce零基础学习(一百三十五)项目中的零碎知识点小总结(七)
    本篇参考:https://trailhead.salesforce.com/content/learn/modules/flow-implementation-2/debug-flows-as-another-userhttps://developer.salesforce.com/docs/platform/lwc/guide/create-components-dom-work.html?q=ref#refshttps://developer.salesforce.com/docs/platfo......
  • 2024-03-27:用go语言,多维费用背包。 给你一个二进制字符串数组 strs 和两个整数 m 和 n
    2024-03-27:用go语言,多维费用背包。给你一个二进制字符串数组strs和两个整数m和n,请你找出并返回strs的最大子集的长度,该子集中最多有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的子集。输入:strs=["10","0001","111001","1","0"],m=......