Go Template 常用疑难知识点
前段时间,在项目开发中经常和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+方法名就行了,但是这里有几点要注意:
-
方法只能返回一个值,或者第二个返回值是Error类型
-
Template执行时,调用方法的主体区分是否指针,不会自动装换,这点需要特别注意
-
方法有参数不需要括号,直接依次空格分割传递就行了,例如下面的ItemScore方法需要2个int参数
{{ $qts.ItemScore 2 2}}
-
方法的连续调用,需要用管道符”|“来链接,比如下面的示例,需要调用”.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...)