Go Template 常用疑難知識(shí)點(diǎn)
前段時(shí)間,在項(xiàng)目開(kāi)發(fā)中經(jīng)常和go語(yǔ)言的HTMLL template打交道,特意總結(jié)了幾點(diǎn)我在使用中經(jīng)常遇到不太明確的,比較糾結(jié)疑惑的知識(shí)點(diǎn),鞏固一下,也方便以后查找。
? 至于關(guān)于go template的系統(tǒng)性的介紹說(shuō)明,這是一篇我經(jīng)常查看的文章,寫的非常全面。
1、作用域訪問(wèn)
? go template中最常打交道的就是點(diǎn)作用域,點(diǎn)"."代表當(dāng)前作用域的當(dāng)前對(duì)象,因此在通常情況下,”.“指的就是傳給template的Execute方法的數(shù)據(jù)對(duì)象。這里針對(duì)是在在Gin環(huán)境中,數(shù)據(jù)對(duì)象就是傳遞給*gin.Context的HTML方法的第三個(gè)參數(shù)
dataContext := gin.H{"examID":exam_id, "examName": exam.Name, "questions": qtypeQuestionsMap}
c.HTML(200, "ffe/exams.tmpl", dataContext)
? 對(duì)應(yīng)與上面的template執(zhí)行代碼,在模板中的頂級(jí)作用域就是上面的dataContext對(duì)象,那么”{{ .questions}}”獲得的就是dataContext["questions"]
? 對(duì)于在range、with方法中,"."相應(yīng)的變?yōu)楫?dāng)前迭代的項(xiàng)目或with的對(duì)象,此時(shí)如果要訪問(wèn)頂級(jí)作用域中的屬性,就要用到"$"這個(gè)一直指向模板級(jí)頂級(jí)作用域的特殊符號(hào)了,注意是模板級(jí)的,在子模板中"$"并不能指向父模板的數(shù)據(jù)對(duì)象(當(dāng)然可以傳遞過(guò)去)
{{ range $qtype,$qss:=.questions }}
{{ $ind = inc $ind }}
{{/*在range中訪問(wèn)頂級(jí)作用域中的對(duì)象qtypeMap并調(diào)用index方法,同時(shí)聲明了$qts局部變量可以在后續(xù)代碼中使用*/}}
{{ $qts := index $.qtypeMap $qtype }}
<div class="qtype" data-qtype="{{$qts.QtypeID}}">{{$qts.QtypeName}}</div>
{{ end }}
2、方法調(diào)用
GO template中調(diào)用實(shí)例方法很簡(jiǎn)單,和訪問(wèn)實(shí)例的字段屬性一樣,不要使用call函數(shù),直接dot+方法名就行了,但是這里有幾點(diǎn)要注意:
-
方法只能返回一個(gè)值,或者第二個(gè)返回值是Error類型
-
Template執(zhí)行時(shí),調(diào)用方法的主體區(qū)分是否指針,不會(huì)自動(dòng)裝換,這點(diǎn)需要特別注意
-
方法有參數(shù)不需要括號(hào),直接依次空格分割傳遞就行了,例如下面的ItemScore方法需要2個(gè)int參數(shù)
{{ $qts.ItemScore 2 2}} -
方法的連續(xù)調(diào)用,需要用管道符”|“來(lái)鏈接,比如下面的示例,需要調(diào)用”.q“的”QOHtmlTyped“方法,參數(shù)為” false“,然后在調(diào)用自定義模板方法”html“
{{ .q.QOHtmlTyped false | html }}
3、自定義函數(shù)
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
},
}
上面代碼是我自定義的一些常用方法,雖然很簡(jiǎn)單,但是在模板中不能實(shí)現(xiàn),只能通過(guò)自定義函數(shù)來(lái)實(shí)現(xiàn)。
對(duì)于Gin環(huán)境下,只需要調(diào)用 *gin.Engine的”SetFuncMap“方法就可以了。
由于我使用了第三方multitemplate庫(kù),需要調(diào)用multitemplate Render的方法
render := multitemplate.NewRenderer()
...
render.AddFromFilesFuncs(name,funcMap,files...)

浙公網(wǎng)安備 33010602011771號(hào)