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+方法名就行了,但是这里有几点要注意:

  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...)
posted @ 2024-03-28 11:55  柒零壹  阅读(7)  评论(0编辑  收藏  举报