基本使用

逻辑代码

package main

import (
	"html/template"
	"net/http"
)

type Page struct {
	Title   string
	Content string
}

func DisPlayPage(w http.ResponseWriter, r *http.Request) {
	p := &Page{
		Title:   "czyt",
		Content: "hello world App",
	}
	t := template.Must(template.ParseFiles("index.html"))
	t.Execute(w, p)
}
func main() {

	http.HandleFunc("/", DisPlayPage)
	http.ListenAndServe(":9090", nil)
}

html模版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.Title}}</title>
</head>
<body>
<p>{{.Content}}</p>
</body>
</html>

模版自定义函数

golang模版有一些内部使用的函数(不到20个),用来进行模版渲染的辅助工作。因此当内部函数不能满足我们的要求时,就需要通过模版自定义函数来实现对应的功能。以在网页界面显示当前时间为例。
后台代码

package main

import (
   "html/template"
   "net/http"
   "time"
)

type Page struct {
   Title   string
   Content string
   Nowdate time.Time
}

func DisPlayPage(w http.ResponseWriter, r *http.Request) {
   p := &Page{
   	Title:   "czyt",
   	Content: "hello world App",
   	Nowdate: time.Now(),
   }
   t:=template.New("index.html")
   t.Funcs(formatFunc)
   t.ParseFiles("index.html")
   t.Execute(w, p)
}

var formatFunc = template.FuncMap{"DateFormat": dateFormat}

func dateFormat(layout string, d time.Time) string {
   return d.Format(layout)
}

func main() {

   http.HandleFunc("/", DisPlayPage)
   http.ListenAndServe(":9090", nil)
}

这里有个坑,使用funcmap的时候template实例需要以本地模版文件的名称作为模板名称,否则函数会调用失败,当然,如果你需要使用自定义的template实例名称,则需要使用t.ExecuteTemplate(w,"index.html",p)这样的代码来解析模版。以上的后台代码中的方法,可以写成下面这样,也是可以正常运行的。

func DisPlayPage(w http.ResponseWriter, r *http.Request) {
	p := &Page{
		Title:   "czyt",
		Content: "hello world App",
		Nowdate: time.Now(),
	}
	t:=template.New("customtemplate")
	t.Funcs(formatFunc)
	t.ParseFiles("index.html")
	t.ExecuteTemplate(w,"index.html",p)
}

模版文件内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{.Title}}</title>
</head>
<body>
<p>{{.Content}}</p>
<p>{{.Nowdate | DateFormat "2006-01-02 15:04:05"}}</p>
</body>
</html>

模版引用

模版继承