GO官方提供了2种对模板解析的标准库,html/template与text/template,html/template可防止代码注入会将html直接转为HTML实体显示。与text/template接口的接口是相同的,实际开发中推荐使用html/template这个包,实际项目中可以使用if判断是否使用text/template显示HTML。
现在主流是前后端分离模式,但是不利用SEO,而我个人又比较喜欢做一点优化,所以模板解析对于我来说太重要了,如果你是一个全栈开发者应该也会比较直出HTML吧~毕竟很爽~
在使用模板引擎的时候我们需要先准备HTML模板,定义好样式与排版。模板渲染可以理解为将我们准备好的模板里特殊字符解析为我们想要的数据。之所以要使用模板,是因为模板给我们带来了易用、简单、可复用等特性,可以将后端的逻辑代码与前端代码分离。不用像http://www.55mx.com/go/92.html里一样直接写内容。我们只需要载入模板即可。
1、解析模板
//Parse 对src路径模板解析
func (t *Template) Parse(src string) (*Template, error)
//ParseFiles 对多个filename批量解析
func ParseFiles(filenames ...string) (*Template, error)
//ParseGlob 匹配正则解析模板
func ParseGlob(pattern string) (*Template, error)
tips:我们也可以使用func myTemp(name string) *Template自己定义一个函数使用上面的方法返回一个自己解析后的模板。
2、模板渲染
//Execute 对模板进行渲染
func (t *Template) Execute(wr io.Writer, data interface{}) error
//ExecuteTemplate 如果同时解析了多个模板(ParseFiles)就要指定一个name
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
3、模板语法
# 渲染数据可以是go的所有类型
# 渲染数据本身
{{ . }}
# 自定义变量
{{ $var = . }}
# struct
# 大写字母开头属性Field
{{ .Field }}
# 嵌套struct时的 属性Field1
{{ .Field.Field1 }}
# 变量为struct时的 属性Field
{{ $x = . }}
{{ $x.Field }}
# 方法
{{ .Method }}
# 嵌套struct的方法
{{ .Field.Method }}
# 嵌套struct的map中struct的方法
{{ .Field.Key.Method }}
# map
# 键名
{{ .key }}
# struct中map
{{ .Field.key }}
# 变量的struct中map
{{ $x = . }}
{{ $x.Field.key }}
# 函数
{{ funName . }}
4、模板里的操作
# 注释
{{/* comment */}}
{{- /* comment */ -}}
# 默认输出,效果 fmt.Print(pipeline)
{{ pipeline }}
# 流程控制
{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
{{with pipeline}} T1 {{end}}
{{with pipeline}} T1 {{else}} T0 {{end}}
# 循环
# array, slice, map, or channel
{{range pipeline}} T1 {{end}}
{{range pipeline}} T1 {{else}} T0 {{end}}
# 嵌套关联
{{template "name"}}
# 当前模板引入其他模板,并且传递数据
{{template "name" pipeline}}
# 等价声明和执行 {{define "name"}} T1 { {end}} & {{template "name" pipeline}}
{{block "name" pipeline}} T1 {{end}}
GO后端代码为:
//webSitting 网站信息配置
type webSitting struct {
SiteName string
URL string
Keywords string
Description string
}
func main() {
sitting := &webSitting{
SiteName: "网络人",
URL: "www.55mx.com",
Keywords: "网络技术,网站优化",
Description: "网络人的说明",
}
// 友情链接 friendlinks
var friendLinks []map[string]string
friendLinks = append(friendLinks, map[string]string{
"siteName": "家常美食网",
"URL": "http://www.jiachangmeishi.com/",
})
friendLinks = append(friendLinks, map[string]string{
"siteName": "美食圈",
"URL": "https://www.meishiq.com/",
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
//1、解析index.tmpl模板
t, err := template.ParseFiles("./index.tpl")
if err != nil {
fmt.Println("模板解析(ParseFiles)出错:", err)
return
}
//2、渲染index.tmpl模板,利用map可以传入多个参数
err = t.Execute(w, map[string]interface{}{
"sitting": sitting, //网站设置传入struct
"friendLinks": friendLinks, //友情链接map
})
if err != nil {
fmt.Println("模板渲染(Execute)出错:", err)
return
}
})
err := http.ListenAndServe(":8000", nil)
if err != nil {
fmt.Println("Web服务器启动失败:", err)
}
}
GO模板代码为:
<!doctype html>
{{ with .sitting }}
{{/* with块里的.sitting不需要再写前缀 */}}{{- .SiteName -}}({{- .URL -}})
{{end}}
{{/*
模板里可以写换行的注释,前端并不会演示这个注释。
注释里//与{{不要有空格。
*/}}{{ .sitting.SiteName }}的友情链接
{{/* range一个切片 */}}
{{ range $i,$link:=.friendLinks }}
{{ if le $i 0}} {{ $i }} {{ $link.siteName }}
{{ else }} {{ $i }} {{ $link.siteName }}
{{end}}
{{ else }}
range friendLinks为空的时候显示这个:还没有友情链接
{{end}}
{{/* if后面的条件 */}}eq 为 == ne 为 != lt 为 < le 为 <= gt 为 > ge 为 >=
name := "网络人"
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
//1、定义一个模板
t := template.New("my.tpl") //创建一个名字是my.tpl的模板对象
//2、向模板里注册一个自己定义的函数或者匿名函数
t.Funcs(template.FuncMap{
"myFuc": func(s string) template.HTML {
//这里的HTML代码会解析为实体
return template.HTML("在模板中使用自定义函数,显示:" + s)
},
})
t.Delims("<!--{", "}-->") //自己定义一个解析语法
//3、解析模板
t.ParseFiles("./my.tpl", "./head.tpl") //解析上面创建的模板对象与需要嵌入的head
//2、渲染index.tmpl模板
t.Execute(w, name)
//上面的语句可以写成1条:template.New("my.tpl").Funcs(template.FuncMap{}).Delims("<!--{", "}-->").ParseFiles("./my.tpl", "./head.tpl").Execute(w, name)
})
http.ListenAndServe(":8000", nil) //启动www服务
模板文件:
<!--{template "head.tpl"}-->
<!--{ myFuc . }-->
<!--{template "foot.tpl"}-->
<!--{ define "foot.tpl"}-->
这是使用define在当前模板里定义的foot.tpl
<!--{end}-->
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/93
《GO web笔记2:http/template自带模板解析引擎标准库》的网友评论(0)