一 简单Web模板
在http服务器使用简单Web模板可以方便我们快速进行web相关的开发。例如给多个用户进行邮件的发送,一些程序的报警信息等等,这时模板的便捷性就体下出来。
package main
import (
"fmt"
"html/template"
"net/http"
)
// 全局的html模板变量
var myTemplate *template.Template
type Result struct {
output string
}
// 实现Write方法,提供给io.WriteString调用。
func (p *Result) Write(b []byte) (n int, err error) {
fmt.Println("called by template")
p.output += string(b)
return len(b), nil
}
// 用于导入html模板实际数据的结构体,必须要与模板对应,否则可能出现未知问题,例如解析不了。
type Person struct {
Name string
Title string
Age int
}
func userInfo(w http.ResponseWriter, r *http.Request) {
// 1. 使用实际的数据去填充html模板。
var arr []Person
p := Person{Name: "tyy", Age: 18, Title: "信息1"}
p1 := Person{Name: "lqq", Age: 19, Title: "信息2"}
p2 := Person{Name: "hc", Age: 20, Title: "信息3"}
arr = append(arr, p)
arr = append(arr, p1)
arr = append(arr, p2)
fmt.Println("arr:", arr)
// 2. 开始解析,并会自行写入到w http.ResponseWriter,这样客户端就能读取到。
//resultWriter := &Result{}
//io.WriteString(resultWriter, "hello 模板") // io.WriteString:将参2的内容写入参1。它接收一个字节切片,所以传入字符串指针是没有问题的(看注释)。
err := myTemplate.Execute(w, arr) // 模板替换, 流程猜想应该是:首先利用hmtl模板,将arr的内容导入的模板实例,然后写入到w http.ResponseWriter中。
if err != nil {
fmt.Println(err)
}
//fmt.Println("template render data:", resultWriter.output)
}
func initTemplate(filename string) (err error) {
myTemplate, err = template.ParseFiles(filename)
if err != nil {
fmt.Println("parse file err:", err)
return
}
return
}
func main() {
// 1. 打开html文件并解析模块。
initTemplate("./index.html")
// 2. 监听http服务。
http.HandleFunc("/user/info", userInfo)
err := http.ListenAndServe("0.0.0.0:9000", nil)
if err != nil {
fmt.Println("http listen failed")
}
}
index.html:
<html>
<!-- table是一个表,一个tr代表一行。td代表一行中的单元。单元里面的数据可以是图片、文字等等 -->
<head>
</head>
<body>
<p>hello world</p>
<table border="1">
{{range .}}
<tr>
<td>{{.Name}}</td> <td>{{.Age}}</td><td>{{.Title}}</td>
</tr>
{{end}}
</table>
</body>
</html>
结果看到,只有有了模板,我们想导入数据,只需要创建对应的结构体实例即可,非常方便。例如我们每天每隔一个小时要向某些人推送重要服务器的告警信息,那么我们可以使用Web模板,将每个小时对应的信息导入到模板,然后进行发送即可,而不需要每次都自己组织结构再发送,这就是Web模板的便捷性。