标准库中的 text/template 包是 Go 语言内置的文本模板引擎.
模板渲染步骤分析
还是从hello world程序开始分析。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package main
import (
"fmt"
"log"
"net/http"
"text/template"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 创建模板对象并解析模板内容
tmpl, err := template.New("test").Parse("Hello world!")
if err != nil {
fmt.Fprintf(w, "Parse: %v", err)
return
}
// 调用模板对象的渲染方法
err = tmpl.Execute(w, nil)
if err != nil {
fmt.Fprintf(w, "Execute: %v", err)
return
}
})
log.Println("Starting HTTP server...")
log.Fatal(http.ListenAndServe("localhost:4000", nil))
}
|
过程分析:
- template.New的作用是根据名称创建一个模板对象
- template.Parse 方法接受一个string参数,即文本模板的内容,然后对内容进行解析,并返回结果。
- template.Execute (io.wirter,interface{})就是渲染模板的方法。有两个参数(输出对象和指定数据对象)。第一个参数,凡是实现了io.Writer接口的实例均可作为输出对象。本例就是w.。第二个参数,是根对象,即渲染时需要的数据,可以接受任何类型。
在模板中渲染变量
首先看一些怎样获取http协议中get请求的url查询参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package main
import (
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(r.URL.Query().Get("val")))
})
log.Println("Starting HTTP server...")
log.Fatal(http.ListenAndServe("localhost:4000", nil))
}
|
然后结合模板操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package main
import (
"fmt"
"log"
"net/http"
"text/template"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// 创建模板对象并解析模板内容
tmpl, err := template.New("test").Parse("The value is: {{.}}")
if err != nil {
fmt.Fprintf(w, "Parse: %v", err)
return
}
// 获取 URL 参数的值
val := r.URL.Query().Get("val")
// 调用模板对象的渲染方法
err = tmpl.Execute(w, val)
if err != nil {
fmt.Fprintf(w, "Execute: %v", err)
return
}
})
log.Println("Starting HTTP server...")
log.Fatal(http.ListenAndServe("localhost:4000", nil))
}
|
模板中的{{.}} 中 点操作符默认只想跟对象,即我们的调用template.Execute方法时传入的第二个参数,本例中跟对象时一个单纯的string类型变量nal。点操作符渲染的就是我们的变狼val.
当然也可以渲其它类型map ,结构体,方法都可以。