网络人

GO web笔记2:http/template自带模板解析引擎标准库

Kwok: 2020-11-17 16:11:40 点击:1 评论: 0

GO官方提供了2种对模板解析的标准库,html/template与text/template,html/template可防止代码注入会将html直接转为HTML实体显示。与显示HTML

现在主流是前后端分离模式,但是不利用SEO,而我个人又比较喜欢做一点优化,所以模板解析对于我来说太重要了,如果你是一个全栈开发者应该也会比较直出HTML吧~毕竟很爽~

一、GO的模板解析与渲染

在使用模板引擎的时候我们需要先准备HTML模板,定义好样式与排版。模板渲染可以理解为将我们准备好的模板里特殊字符解析为我们想要的数据。之所以要使用模板,是因为模板给我们带来了易用、简单、可复用等特性,可以将后端的逻辑代码与前端代码分离。不用像http://www.neter8.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.neter8.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}-->
本文地址:http://m.neter8.com/go/93.html

本站推荐阅读

热门点击文章