惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
D
Docker
M
MIT News - Artificial intelligence
L
LangChain Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
美团技术团队
S
Schneier on Security
G
GRAHAM CLULEY
月光博客
月光博客
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Scott Helme
Scott Helme
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
量子位
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
Cloudbric
Cloudbric
爱范儿
爱范儿
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives

博客园 - 柒零壹

Ubuntu 24.04 安装最新版podman@5.6.1 [转贴]在前端如何玩转 Word 文档 一个命令行参数解决open-webui镜像启动失败的问题(huggingface网站访问失败问题) 从数据库中随机选取数据(基于golang,xorm) go-ElasticSearch TypedClient学习笔记 golang用pgx查询数据时如何将查询结果方便的放入Map中 go语言如何使用elastic官方客户端go-elasticsearch/v8实现数据批量更新 【转】网络常用颜文字(文字表情) GoCV下实现多图片单窗口内同时显示 解决GoCV/OpenCV不支持中文的问题 golang中xorm自动维护表结构自动导入数据的实现 [golang] gin的中间中调用Abort方法导致的带附件的表单提交时,浏览器报net::ERR_CONNECTION_RESET错误的原因及解决方法 [golang]filepath.Glob的缺陷,不支持多级目录 浏览器中javascript简易实现json数据保存到客户端 最简单搭建前端轻量级项目开发服务 [转]Three.js做一个酷炫的城市展示可视化大屏 [转]css实现不同样式的tooltip对话框小三角 [原]升级项目到Rails7.0.3,使用自己手动方案编译打包css及js资源 puma web server如何监听所有IP地址
Go Template 常用疑难知识点
柒零壹 · 2024-03-28 · via 博客园 - 柒零壹

前段时间,在项目开发中经常和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...)