template包(html/template)实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。本包提供了和text/template包相同的接口,无论何时当输出是HTML的时候都应使用本包。
main.go
package main
import (
"html/template"
"io/ioutil"
"os"
"time"
"fmt"
)
func main() {
t := template.New("第一个模板").Delims("[[", "]]") //创建一个模板,设置模板边界
t, _ = t.Parse("hello,[[.UserName]]\n") //解析模板文件
data := map[string]interface{}{"UserName": template.HTML("<script>alert('you have been pwned')</script>")}
t.Execute(os.Stdout, data) //执行模板的merger操作,并输出到控制台
t2 := template.New("新的模板") //创建模板
t2.Funcs(map[string]interface{}{"tihuan": tihuan}) //向模板中注入函数
bytes, _ := ioutil.ReadFile("test2.html") //读文件
template.Must(t2.Parse(string(bytes))) //将字符串读作模板
t2.Execute(os.Stdout, map[string]interface{}{"UserName": "你好世界"})
fmt.Println("\n", t2.Name(), "\n")
t3, _ := template.ParseFiles("test1.html") //将一个文件读作模板
t3.Execute(os.Stdout, data)
fmt.Println(t3.Name(), "\n") //模板名称
t4, _ := template.ParseGlob("test1.html") //将一个文件读作模板
t4.Execute(os.Stdout, data)
fmt.Println(t4.Name())
}
//注入模板的函数
func tihuan(str string) string {
return str + "-------" + time.Now().Format("2006-01-02")
}
test1.html
<!DOCTYPE html>
<html>
<head>
<title>template</title>
</head>
<body>
hello {{.UserName}}<br>
</body>
</html>
test2.html
<!DOCTYPE html>
<html>
<head>
<title>template</title>
</head>
<body>
hello {{.UserName}}<br>
{{tihuan .UserName}}
</body>
</html>
模版解析
// 模版解析
func (this *YulanController) parseTemplate(tplname string, data interface{}) (string, error) {
var html string
b, err := ioutil.ReadFile(tplname)
if err != nil {
fmt.Println(tplname, err)
return "", err
}
t := template.New(tplname)
template.Must(t.Parse(string(b)))
wr := bytes.NewBufferString("")
err = t.Execute(wr, data)
if err != nil {
fmt.Println(err)
return "", err
}
return wr.String(), err
}