D:\go\src\go7\demo2\main.go
//本节将学习模板内置函数的使用、自定义函数的使用、管道符的使用
package main
import (
"log"
"net/http"
"text/template"
)
func Index(w http.ResponseWriter, r *http.Request) {
log.SetFlags(log.Lshortfile | log.LstdFlags)
//func ParseFiles(filenames ...string) (*Template, error)
//ParseFiles从"index.html"中解析模板。
//如果发生错误,解析停止,返回的*Template为nil。
//当解析多个文件时,如果文件分布在不同目录中,且具有相同名字的,将以最后一个文件为主。
//当解析多个文件时,如果文件分布在相同目录中,且具有不同名字的,将以第一个文件为主。
files, err := template.ParseFiles("index1.html", "base1.html")
if err != nil {
log.Println(err.Error())
}
//func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
//渲染模板文件,并将定义的map类型的数据传入模板文件中
//由于采用的Execute方法,那么渲染的模板应当遵循template.ParseFiles的解析顺序
//需要注意的是参数name的类型是string,这里是模板的名字。
//如果在模板文件中定义了{{define "html_index1"}}{{end}},那么,这里的name参数就应当写为"html_index1"
//如果没有在模板文件中进行重新定义,那么就使用默认,默认的就是文件名,注意,不包含路径名
err = files.Execute(w, map[string]interface{}{
"name": "张三丰",
})
if err != nil {
log.Println(err.Error())
}
//w.Write([]byte("hello"))
}
func Home(w http.ResponseWriter, r *http.Request) {
log.SetFlags(log.Lshortfile | log.LstdFlags)
//func ParseFiles(filenames ...string) (*Template, error)
//ParseFiles从"index.html"中解析模板。
//如果发生错误,解析停止,返回的*Template为nil。
//当解析多个文件时,如果文件分布在不同目录中,且具有相同名字的,将以最后一个文件为主。
//当解析多个文件时,如果文件分布在相同目录中,且具有不同名字的,将以第一个文件为主。
files, err := template.ParseFiles("index2.html", "base2.html")
if err != nil {
log.Println(err.Error())
}
//func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
//渲染模板文件,并将定义的map类型的数据传入模板文件中
//由于采用的Execute方法,那么渲染的模板应当遵循template.ParseFiles的解析顺序
//需要注意的是参数name的类型是string,这里是模板的名字。
//如果在模板文件中定义了{{define "html_index1"}}{{end}},那么,这里的name参数就应当写为"html_index1"
//如果没有在模板文件中进行重新定义,那么就使用默认,默认的就是文件名,注意,不包含路径名
//err = files.ExecuteTemplate(w, "index2.html", map[string]interface{}{
//"name": "张三丰",
//})
err = files.ExecuteTemplate(w, "index2.html", map[string]interface{}{
"name": "张三丰",
})
if err != nil {
log.Println(err.Error())
}
}
func main() {
http.HandleFunc("/index", Index)
http.HandleFunc("/home", Home)
_ = http.ListenAndServe(":80", nil)
}
D:\go\src\go7\demo2\base1.html
{{define "base1.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#head {
background: coral;
height: 30px;
}
#body {
background: cadetblue;
height: 80px;
}
#foot {
background: dimgray;
height: 50px;
}
</style>
</head>
<body>
<div id="head">base1 head</div>
<div id="body">
{{block "body" .}}
{{end}}
</div>
<div id="foot">base1 foot</div>
</body>
</html>
{{end}}
D:\go\src\go7\demo2\base2.html
{{define "index2.html"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#head {
background: coral;
height: 100px;
}
#body {
background: cadetblue;
height: 300px;
}
#foot {
background: dimgray;
height: 500px;
}
</style>
</head>
<body>
<div id="head">base2 head</div>
<div id="body">
{{block "body" .}}
{{end}}
</div>
<div id="foot">base2 foot</div>
</body>
</html>
{{end}}
D:\go\src\go7\demo2\index1.html
{{define "index1.html"}}
{{template "base1.html" .}}
{{end}}
{{define "body"}}
index1
{{end}}
D:\go\src\go7\demo2\index2.html
{{define "index2"}}
{{template "base2.html" .}}
{{end}}
{{define "body"}}
index2
{{end}}
D:\go\src\go7\demo2\main_test.go
package main
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func TestIndex(t *testing.T) {
handler := http.HandlerFunc(Index)
app := httptest.NewServer(handler)
defer app.Close()
_url := app.URL + "/" + "index"
t.Log(_url)
response, _ := http.Get(_url)
defer response.Body.Close()
bytes, _ := ioutil.ReadAll(response.Body)
t.Log(string(bytes))
}
func TestHome(t *testing.T) {
handler := http.HandlerFunc(Home)
app := httptest.NewServer(handler)
defer app.Close()
_url := app.URL + "/" + "home"
t.Log(_url)
response, _ := http.Get(_url)
defer response.Body.Close()
bytes, _ := ioutil.ReadAll(response.Body)
t.Log(string(bytes))
}
运行结果