go创建漂亮好看的HTML,Gohtmltemplate模板的使⽤实例从字符串载⼊模板
我们可以定义模板字符串,然后载⼊并解析渲染:
template.New(tplName string).Parse(tpl string)
// 从字符串模板构建
tplStr := `
{{ .Name }} {{ .Age }}
`
// if parse failed Must will render a panic error
tpl := template.Must(template.New("tplName").Parse(tplStr))
tpl.Execute(os.Stdout, map[string]interface{}{Name: "big_cat", Age: 29})
从⽂件载⼊模板
模板语法
模板⽂件,建议为每个模板⽂件显式的定义模板名称:{{ define "tplName" }},否则会因模板对象名与模板名不⼀致,⽆法解析(条件分⽀很多,不如按⼀种标准写法实现),另展⽰⼀些基本的模板语法。
使⽤ {{ define "tplName" }} 定义模板名
使⽤ {{ template "tplName" . }}引⼊其他模板
使⽤ . 访问当前数据域:⽐如range⾥使⽤.访问的其实是循环项的数据域
使⽤ $. 访问绝对顶层数据域
views/header.html
{{ define "header" }}
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
{{ .PageTitle }}
{{ end }}
views/footer.html
{{ define "footer" }}
{{ end }}
views/index/index.html
{{ define "index/index" }}
{{/*引⽤其他模板 注意后⾯的 . */}}
{{ template "header" . }}
hello, {{ .Name }}, age {{ .Age }}
{{ template "footer" . }}
{{ end }}
{{ define "news/index" }}
{{ template "header" . }}
{{/* 页⾯变量定义 */}}
{{ $pageTitle := "news title" }}
{{ $pageTitleLen := len $pageTitle }}
{{/* 长度 > 4 才输出 eq ne gt lt ge le */}}
{{ if gt $pageTitleLen 4 }}
{{ $pageTitle }}
{{ end }}
{{ $c1 := gt 4 3}}
{{ $c2 := lt 2 3 }}
{{/*and or not 条件必须为标量值 不能是逻辑表达式 如果需要逻辑表达式请先求值*/}} {{ if and $c1 $c2 }}
1 == 1 3 >
2 4 < 5
{{ end }}
{{ range .List }}
{{ $title := .Title }}
{{/* .Title 上下⽂变量调⽤ func param1 param2 ⽅法/函数调⽤ $.根节点变量调⽤ */}}
{{ $title }} -- {{ .CreatedAt.Format "2006-01-02 15:04:05" }} -- Author {{ $.Author }} {{end}}
{{/* !empty Total 才输出*/}}
{{ with .Total }}
总数:{{ . }}
{{ end }}
{{ template "footer" . }}
{{ end }}
template.ParseFiles
⼿动定义需要载⼊的模板⽂件,解析后制定需要渲染的模板名news/index。
// 从模板⽂件构建
tpl := template.Must(
template.ParseFiles(
"views/index/index.html",
"views/news/index.html",
"views/header.html",
)
,
)
// render template with tplName index
_ = tpl.ExecuteTemplate(
os.Stdout,
"index/index",
map[string]interface{}{
PageTitle: "⾸页",
Name: "big_cat",
Age: 29,
},
)
// render template with tplName index
_ = tpl.ExecuteTemplate(
os.Stdout,
"news/index",
map[string]interface{}{
"PageTitle": "新闻",
"List": []struct {
Title string
CreatedAt time.Time
}{
{Title: "this is golang views/template example", CreatedAt: time.Now()},
{Title: "to be honest, i don't very like this raw engine", CreatedAt: time.Now()},
},
"Total": 1,
"Author": "big_cat",
},
)
template.ParseGlob
⼿动的指定每⼀个模板⽂件,在⼀些场景下难免难以满⾜需求,我们可以使⽤通配符正则匹配载⼊。
1、正则不应包含⽂件夹,否则会因⽂件夹被作为视图载⼊⽆法解析⽽报错
2、可以设定多个模式串,如下我们载⼊了⼀级⽬录和⼆级⽬录的视图⽂件
// 从模板⽂件构建
tpl := template.Must(template.ParseGlob("views/*.html"))
template.Must(tpl.ParseGlob("views/*/*.html"))
// render template with tplName index
// render template with tplName index
_ = tpl.ExecuteTemplate(
os.Stdout,
"index/index",
map[string]interface{}{
PageTitle: "⾸页",
Name: "big_cat",
Age: 29,
},
)
// render template with tplName index
_ = tpl.ExecuteTemplate(
os.Stdout,
"news/index",
map[string]interface{}{
"PageTitle": "新闻",
"List": []struct {
Title string
CreatedAt time.Time
}{
{Title: "this is golang views/template example", CreatedAt: time.Now()},
{Title: "to be honest, i don't very like this raw engine", CreatedAt: time.Now()},
},
"Total": 1,
"Author": "big_cat",
},
)
学校网站免费html模板Web服务器
结合html/template模板库和net/http实现⼀个可以使⽤模板渲染并返回html页⾯的web服器。package main
import (
"html/template"
"log"
"net/http"
"time"
)
var (
htmlTplEngine *template.Template
htmlTplEngineErr error
)
func init() {
// 初始化模板引擎 并加载各层级的模板⽂件
/
/ 注意 views/* 不会对⼦⽬录递归处理 且会将⼦⽬录匹配 作为模板处理造成解析错误
// 若存在与模板⽂件同级的⼦⽬录时 应指定模板⽂件扩展名来防⽌⽬录被作为模板⽂件处理// 然后通过 view/*/*.html 来加载 view 下的各⼦⽬录中的模板⽂件
htmlTplEngine = template.New("htmlTplEngine")
// 模板根⽬录下的模板⽂件 ⼀些公共⽂件
_, htmlTplEngineErr = htmlTplEngine.ParseGlob("views/*.html")
if nil != htmlTplEngineErr {
log.Panic(htmlTplEngineErr.Error())
}
// 其他⼦⽬录下的模板⽂件
_, htmlTplEngineErr = htmlTplEngine.ParseGlob("views/*/*.html")
if nil != htmlTplEngineErr {
log.Panic(htmlTplEngineErr.Error())
}
}
// index
func IndexHandler(w http.ResponseWriter, r *http.Request) {
_ = htmlTplEngine.ExecuteTemplate(
w,
"index/index",
map[string]interface{}{"PageTitle": "⾸页", "Name": "sqrt_cat", "Age": 25},
)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论